它究竟意味着Verilog中always @()表达式中的Argument是什么意思?

时间:2016-03-28 10:52:08

标签: verilog synthesis

当我有这样的敏感表达时:

always @ (data)
begin
.
.
end

这是否意味着每次"数据"改变"开始"过程会发生吗?但是,如果数据实际上变为相同的数字会发生什么,例如:读取有限数列表(其中数据的值有时与其连续相同)。在这种情况下,它会将其识别为新数据(即使是相同的值),或者只是将其忽略为"更改"并且"开始"不会激活自己?

3 个答案:

答案 0 :(得分:4)

always@块用于描述事件,应该在某些条件下发生。

always@( * )块用于描述组合逻辑或逻辑门

always@(posedge Clock)(“始终位于时钟的正边缘”)或always@(negedge Clock)(“始终位于时钟的负边缘 “)块用于描述顺序逻辑或寄存器

敏感度列表指定哪些信号应触发<{strong> always块内的元素。以下是一些例子:

always @ ( A or B ) begin // executes when A=1 or B=1
// always @ ( * )   begin // same as above. executes when A=1 or B=1
 C = A & B ;
end

always @ ( A and B ) begin // executes when A=1 AND B=1
 C = A & B ;
end

不完整的敏感度列表几乎从不需要。他们介绍了非常难以找到的错误。因此,我们使用always@(*)。 '*'敏感度列表设置为任何值,这些值会对确定的值产生影响通过always@(*)块。

在您的情况下,如果data仍为相同,则always阻止将永远不会执行。在您的情况下,如果它是一个组合块,always@(*) 推荐

如果data在每个时间戳时仍然是相同,则不会执行给定的always 。由于输入/敏感元素@(data))保持相同输出/计算元素逻辑值计算<计算中的/ strong>内部always块)也应相同

有关详细信息,Always block PDF可能有用。

答案 1 :(得分:2)

是的!你是对的。 假设数据在每个时钟上发生变化,而data_delayed则是数据的翻转版本 begin...end仅在执行时执行 data_delayed != data,因此如果数据更改为相同的值,则不会执行。

答案 2 :(得分:2)

其他答案仅与RTL综合的观点相关。对于更高水平的合成,或从非综合的角度来看,它认为这是一个清晰的描述:

always构造实例化从模拟的时间0开始并在此之后的所有时间都存在的单个进程。该过程可能包括单个程序性陈述或程序性陈述。当程序性陈述或陈述完成时,该过程再次启动程序性陈述。

现在,任何程序性陈述都可以在其前面设置时间控制,例如@(expression)#(delay)@(expression)表示等待表达式值的更改。在执行具有时序控制的语句之后,更改必须。这就是为什么

always @(data) statement;

不会成为无限循环。

以上的原因应该被理解为&#34;每次数据更改时,执行语句&#34; 是因为如果该语句被阻止了一些关于当数据再次变化时,该语句在完成之后才会执行。例如

always @(posedge clk) do_this;

task do_this;
  // some stuff
  @(posedge clk);
  // some more stuff
endtask

每个@(posedge clk)都不会调用do_this任务。每隔一个叫@(posedge clk)。

可能有

always @(data) statement;

在同一个插槽中执行多次,但这取决于数据如何更改其值以及语句的内容,第I位将留下更高级的讨论。