Vrilog HDL综合时,网线型数据被映射成硬件的连线,而寄存器型变量则要根据上下文被赋值的环境来确定映射成连线还是存储元件(触发器或锁存器)。
例module boke(acr,bar,fra,sqp);
input acr,bar,fra;
output sqp;
wire acr,bar,fra;
reg sqp,trq;
always@(acr or bar or fra)
begin
sqp="trq|fra";
trq="bar"&acr;
end
endmodule
该语句语义很明确,只要出现与事件表列出的bar、acr、fra相关的事件,就会执行always语句。因为trq在被赋值之前就被引用了,在重复执行always语句过程中trq不得不保持原值,所以它被推导成为存储器。不过,这还不足以明确如何把trq构造成锁存器,因为trq未在任何条件控制下被赋值。此时,综合系统可能无法为其建立锁存器,而有可能生成图示电路。(被综合成网线)
ash_riple_768180695 2007-5-7 09:52
分析得很精彩。
我经常被这样的公式搞懵。每次看到阻塞式赋值语句都会陡然紧张起来。如履薄冰般地分析完毕,往往还会出错。人脑不是电脑,实在是太绕了。
能不能换个角度考虑:禁止书写这样的语句,不要和综合工具玩捉迷藏。
从学习语言本身的角度出发,进行这样的锻炼是必要的。但是从使用语言描述电路的角度出发,这样的描述完全可以避免。
从语言本身考虑,wire型和reg型是两种变量;从电路出发考虑,组合逻辑和时序逻辑是两种基本电路类型。
如果能够记住:描述时序逻辑,必须采用reg型;描述组合逻辑,可以采用wire型,也可以采用reg型;采用reg型描述,哪种方式会得到时序逻辑、哪种方式会得到组合逻辑,区分一下。
有了上面三条,基本的电路描述就不成问题了。再附加一点:时序逻辑采用"always <= "描述,组合逻辑采用"assign = "描述。这样,就不会出现人脑不如电脑的问题了。