关于如何在Verilog模块中编写always
块,我有一个简单的问题
如果我的Verilog模块中有以下输入:
input [31:0] PCplus4 ; // Value of PC + 4
input [31:0] A; // Value A, i.e. RSbus (Use Forwarded Value)
input [31:0] B; // Value B, i.e. RTbus (Use Forwarded Value)
input [31:0] IMM; // Extended Immediate Value
input [25:0] TARGET; // Target Address for Jumps
input [3:0] BR; // Branch Selector Input
如果我使用
有什么不同always @ (*)
而不是
always @ (PCplus4 or A or B or IMM or TARGET or BR)
这个always @ (*)
语法对所有版本的Verilog都有效吗?
答案 0 :(得分:10)
2001年,IEEE {Veridog Std}添加了always @(*)
语法。所有现代Verilog工具(模拟器,综合等)都支持这种语法。
以下是LRM(1800-2009)的引用:
一个不完整的event_expression列表 事件控制是一个常见的来源 寄存器传输级别(RTL)中的错误 模拟。隐含的 event_expression,@ *,很方便 消除这些的简写 添加所有网络的问题 由...读取的变量 声明(可以是声明 过程_timing_的一组 control_statement到 event_expression。
因此,您的两行代码可能是等效的(它取决于always
块体内的代码)。但是,@*
语法更容易维护。
答案 1 :(得分:3)
always @(*)
是2001年修订标准中的语言的补充。最近发布的所有质量工具都支持它。我不担心在用于任意重用的代码中使用该构造,但是,有可能遇到不支持always @(*)
的旧工具,尤其是涉及内部实用程序时。
答案 2 :(得分:0)
这只是列出always block所依赖的所有电线的快捷方式。那些电线是“灵敏度列表”。使用它的一个优点是合成代码不太可能关心你放在灵敏度列表中的内容(除了posedge和negedge),因为导线将“物理”连接在一起。模拟器可能依赖于列表来选择应该导致块执行的事件。如果更改块并忘记更新列表,则模拟可能与实际合成行为不同。
答案 3 :(得分:0)
尽管两者都是等价的,但使用always@(*)
可以避免任何模拟合成不匹配。
假设您在敏感度列表中有15个信号,如下所示:
always@( a1 or a2 or ... or a15)
现在假设设计师错误地错过了此列表中的a14。综合工具忽略了这一事实并合成代码,假设该块内RHS上的所有信号都在灵敏度列表中。而模拟工具的行为则不同,因为它取决于灵敏度列表。
答案 4 :(得分:0)
对于第一个问题......我会说这取决于在第二种情况下,那些是您认为可以改变的唯一输入,这将导致触发输出。理想情况下,使用*会更好,因为它表示“输入的任何变化”,也有助于避免冗长的代码。
对于第二个问题.....它是在verilog -2001中引入的,从那以后它被广泛使用。
答案 5 :(得分:0)
*
表示包括所有输入,因此等效于写入所有输入。
如果您希望模块的组合电路不是顺序的,则始终使用*
符号也很有用,因为每当输入改变时,总会发生变化。