Verilog中的always@()表达式中的参数到底是什么意思?
当我有这样一个敏感的表达:Verilog中的always@()表达式中的参数到底是什么意思?,verilog,synthesis,Verilog,Synthesis,当我有这样一个敏感的表达: always @ (data) begin . . end 这是否意味着每次“数据”更改都会发生“开始”过程?但是,如果数据实际更改为相同的数字会发生什么情况,例如:读取一个有限数字列表(其中数据的值有时与其相邻的值相同)。在这种情况下,它会将其识别为新数据(即使是相同的值)还是将其忽略为“更改”而“开始”不会自动激活?是!你是对的。 假设每个时钟上的数据都发生变化,并且延迟的数据是数据的触发器版本,那么 begin…end仅在以下情况下执行 数据延迟!=数据,所以
always @ (data)
begin
.
.
end
这是否意味着每次“数据”更改都会发生“开始”过程?但是,如果数据实际更改为相同的数字会发生什么情况,例如:读取一个有限数字列表(其中数据的值有时与其相邻的值相同)。在这种情况下,它会将其识别为新数据(即使是相同的值)还是将其忽略为“更改”而“开始”不会自动激活?是!你是对的。
假设每个时钟上的数据都发生变化,并且延迟的数据是数据的触发器版本,那么
begin…end
仅在以下情况下执行
数据延迟!=数据
,所以如果数据更改为相同的值,它将不会执行。是!你是对的。
假设每个时钟上的数据都发生变化,并且延迟的数据是数据的触发器版本,那么
begin…end
仅在以下情况下执行
数据延迟!=数据
,因此如果数据更改为相同的值,它将不会执行。始终@
块用于描述在特定条件下发生的事件
始终@(*)
块用于描述组合逻辑或逻辑门
始终(posedge时钟)
(始终位于时钟的正边缘)或始终(负边缘时钟)
(始终位于时钟的负边缘)块用于描述顺序逻辑或寄存器
灵敏度列表指定应触发始终
块内元素的信号。以下是一些例子:
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
不完整的敏感度列表几乎是不需要的。它们引入了很难找到的bug。因此,我们使用始终@(*)
“*”将敏感度列表设置为可能对始终(*)
块确定的值产生影响的任何值
在您的情况下,如果数据
保持不变,则永远不会执行块。在您的情况下,如果它是一个组合块,总是@(*)
也是推荐的
如果数据
在每个时间戳都保持相同,则不应执行给定的始终
块。由于输入/敏感元件(@(数据)
)保持相同,而输出/计算元件(逻辑值计算在始终
块内)也应相同
有关更多详细信息,请参见。始终@
块用于描述在特定条件下发生的事件
始终@(*)
块用于描述组合逻辑或逻辑门
始终(posedge时钟)
(始终位于时钟的正边缘)或始终(负边缘时钟)
(始终位于时钟的负边缘)块用于描述顺序逻辑或寄存器
灵敏度列表指定应触发始终
块内元素的信号。以下是一些例子:
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
不完整的敏感度列表几乎是不需要的。它们引入了很难找到的bug。因此,我们使用始终@(*)
“*”将敏感度列表设置为可能对始终(*)
块确定的值产生影响的任何值
在您的情况下,如果数据
保持不变,则永远不会执行块。在您的情况下,如果它是一个组合块,总是@(*)
也是推荐的
如果数据
在每个时间戳都保持相同,则不应执行给定的始终
块。由于输入/敏感元件(@(数据)
)保持相同,而输出/计算元件(逻辑值计算在始终
块内)也应相同
对于更多的细节,可能有用。其他答案仅从RTL合成的角度相关。对于更高层次的合成,或者从非合成的角度来看,它认为这是一个清晰的描述:
总是
构造实例化一个从模拟的时间0开始并在此之后一直存在的单个进程。该过程可能由单个程序语句或程序语句块组成。当一个或多个程序性陈述完成时,流程将重新开始程序性陈述
现在,任何过程语句前面都可以有一个计时控件,如@(表达式)
或#(延迟)
。@(表达式)
表示等待表达式值的更改。更改必须在执行具有定时控制的语句后进行。这就是为什么
always @(data) statement;
不会成为一个无限循环
上述内容不应被解读为“每次数据更改时,执行语句”的原因是,如果该语句在数据再次更改时被阻塞了大约一段时间,则该语句不会被删除
always @(data) statement;