当我有这样的敏感表达时:
always @ (data)
begin
.
.
end
这是否意味着每次"数据"改变"开始"过程会发生吗?但是,如果数据实际上变为相同的数字会发生什么,例如:读取有限数列表(其中数据的值有时与其连续相同)。在这种情况下,它会将其识别为新数据(即使是相同的值),或者只是将其忽略为"更改"并且"开始"不会激活自己?
答案 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位将留下更高级的讨论。