Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog中的always@()表达式中的参数到底是什么意思?_Verilog_Synthesis - Fatal编程技术网

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;