Verilog 什么时候确切地使用;分配;关键字和何时使用<=&引用;接线员?

Verilog 什么时候确切地使用;分配;关键字和何时使用<=&引用;接线员?,verilog,Verilog,我正在学习verilog,我读了一些教程,但对此我有点困惑: 使用“assign”关键字的时间和原因以及使用“assign的时间和原因用于驱动导线/网络类型声明。由于导线根据驱动它们的值更改值,因此每当RHS上的操作数更改时,该值将被计算并分配给LHS(从而模拟导线) 每当右侧值更改时,连续赋值将值驱动到网络中,因此连续赋值始终处于活动状态,并且每当右侧操作数更改时,赋值都会发生 连续赋值提供了一种比门级逻辑更高抽象级别的模型组合逻辑 始终是一个程序块,用于建模寄存器和组合逻辑。始终块包含灵敏度

我正在学习verilog,我读了一些教程,但对此我有点困惑:


使用“assign”关键字的时间和原因以及使用“
assign
的时间和原因用于驱动导线/网络类型声明。由于导线根据驱动它们的值更改值,因此每当RHS上的操作数更改时,该值将被计算并分配给LHS(从而模拟导线)

每当右侧值更改时,连续赋值将值驱动到网络中,因此连续赋值始终处于活动状态,并且每当右侧操作数更改时,赋值都会发生

连续赋值提供了一种比门级逻辑更高抽象级别的模型
组合逻辑

始终
是一个程序块,用于建模寄存器和组合逻辑。
始终
块包含灵敏度列表,即事件列表,必须根据该列表评估块内的逻辑

始终(@posedge clk)
在每个正边缘处触发块内的逻辑。从而模拟触发器类型的行为

always@(*)
所有RHS语句敏感。如果always块的RHS中的任何内容发生更改,则会计算并分配该特定表达式。这类似于
assign
语句,但此类型的块用于驱动
reg
数据类型

// var_z needs to be driven continuously
// Evaluated when any of x or y changes
assign var_z = x|~y 
有关更多信息,请参阅和

进入阻塞语句和非阻塞语句

在执行顺序块中紧随其后的语句之前,必须执行阻塞语句

N关于阻塞语句允许您在不阻塞程序流的情况下安排作业

通过以下示例可以更好地理解阻塞和非阻塞分配:

x = #10 5;   // x = 5 at time 10ns
y = #5  6;   // y = 6 at time 15ns

x <= #10 5;  // y = 6 at time 10ns
y <= #5  6;  // y = 6 at time 5ns

流水线建模CAL有效地通过非阻塞赋值来完成。考虑移位登记的例子:

// Improper hardware, q3 is directly assigned the value of d
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2; end

// Proper hardware, q3=q2, q2=q1 and q1=d
always @(posedge clk) begin
q1 <= d;
q2 <= q1;
q3 <= q2; end
//硬件不正确,q3直接赋值为d
始终@(posedge clk)开始
q1=d;
q2=q1;
q3=q2;结束
//合适的硬件,q3=q2,q2=q1和q1=d
始终@(posedge clk)开始
q1
// Improper hardware, q3 is directly assigned the value of d
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2; end

// Proper hardware, q3=q2, q2=q1 and q1=d
always @(posedge clk) begin
q1 <= d;
q2 <= q1;
q3 <= q2; end