|
发表于 2010-6-15 12:25:38
|
显示全部楼层
本帖最后由 hsiangantw 于 2010-6-15 12:27 编辑
“process” 内顺序执行指的是逻辑层面上,合成工具为正确理解设计者的意思而言,并非实际硬件电路上具有 ”顺序执行” 的特性。
例如:
process (a, b)
begin
if a=’0’ then
c <= b;
else
c <= not b;
end if;
end process;
就concurrent电路的角度来看,在一块电路中,同时将c设为b,与not b是自我矛盾的。但是就process内来看,则受到a的条件制约,在a = ‘0’ 的条件成立时,与不成立时,分别指定不同的信号。
合成时,会以一由信号a选择的双输入multiplexer切换选择b与not b的信号,并将multiplexer的输出指定给c。
亦即,若将MUX的输入与输出关系给考虑进来,就能正确理解电路的功能:
MUX_SEL <= a; -- multiplexer SELECT input
MUX_IN0 <= b; -- multiplexer IN0, enabled if MUX_SEL = ‘0’
MUX_IN1 <= not b; -- multiplexer IN1, enabled if MUX_SEL = ‘1’
c <= MUX_O; -- multiplexer output
实际硬件电路上,b与not b这两条路径的运算,分别有各自独立的电路,在信号b进入模块后是同时执行的。
此时,电路的最长时间延迟,包括一个not 闸,与一个MUX的delay。最短时间延迟,则仅包括一个MUX。
这种现象,与透过CPU或micro-controller顺序执行程序代码的概念有很大的不同。
另一个例子如:
process ( clk )
begin
if clk’event and clk=’0’ then
if a=’0’ then
c <= b;
else
c <= not b;
end if;
end if;
end process;
在这个电路中,由于指定了下降沿产生变化的信号c,所以会infer一个register存储组件。
但是,此时multiplexer的输出就不会直接指定给c,实际上是指定给register的输入,经过clk触发后的register输出才接到c。
此时电路的最长时间延迟,包括not、MUX与一个FF。
此时就牵涉到clk的period时间长度、输入信号a、b、运算所需时间、register的setup与hold time等时序上的问题。
进一步又牵涉到输入信号a, b的来源是asynchronous或synchronous、clock domain、clock skew、net delay等问题。深入的话就谈不完了。
但是针对顶层所提的问题来讲,确实:
1. 时序电路在process里面,确实要考虑到clock period timing与运算延迟的问题。但是,各别的信号路径所产生的运算延迟,是分开计算的,而非依序迭加计算的。
2. 换句话说,发生信号延迟无法满足时序要求的时候,首要针对最长路径来作分析与优化。
3. 最后,每一条路径的运算都是同时在进行的,这跟CPU执行软件的概念有很大的差异,要特别留意的。
4. 最后的最后,注意实务上每个模块彼此间的信号交连的过程中,除频率频率外还牵涉到时域差异的问题,设计时间没考虑清楚的话,在模拟与测试过程中易有各种奇怪的意外发生。 |
|