Verilog语法之六:阻塞赋值与非阻塞赋值(转载)

Verilog语法之六:阻塞赋值与非阻塞赋值
在描述组合逻辑的always 块中用阻塞赋值,则综合成组合逻辑的电路结构。
在描述时序逻辑的always 块中用非阻塞赋值,则综合成时序逻辑的电路结构。
为什么一定要这样做呢?这是因为要使综合前仿真和综合后仿真一致的缘故。

[例1]用阻塞赋值的反馈振荡器(不好的例子)

module fbosc1 (y1, y2, clk, rst);
 output y1, y2; 
 input clk, rst;
 reg y1, y2;

 always @(posedge clk or posedge rst)
 begin
     if (rst) y1 = 0; // reset
     else y1 = y2;
 end

 always @(posedge clk or posedge rst)
 begin
     if (rst) y2 = 1; // preset
     else y2 = y1;
 end
endmodule

例1中,如果前一个always块的复位信号先到0 时刻,则y1 和y2 都会取1,而如果后一个always 块的复位信号先到0 时刻,则y1 和y2 都会取0。这清楚地说明这个Verilog 模块是不稳定的会产生冒险和竞争的情况。
如果在一个过程块中阻塞赋值的RHS 变量正好是另一个过程块中阻塞赋值的LHS 变量,这两个过程块又用同一个时钟沿触发,如果阻塞赋值的次序安排不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的次序是无法确定的。

若采用阻塞赋值,则

无论哪一个always 块的复位信号先到, 两个always 块中的非阻塞赋值都在赋值开始时刻计算RHS 表达式,而在结束时刻才更新LHS 表达式。所以这两个always 块在复位信号到来后,在always 块结束时 y1 为0 而y2为1 是确定的。从用户的角度看这两个非阻塞赋值正好是并行执行的。

[例4] 用阻塞赋值来描述移位寄存器也是可行的,但这种风格并不好。(方式 #2 )

 module pipeb2 (q3, d, clk);
 output [7:0] q3;
 input [7:0] d;
 input clk;
 reg [7:0] q3, q2, q1;

 always @(posedge clk)
 begin
 q3 = q2;
 q2 = q1;
 q1 = d;
 end

endmodule

在上面的模块中,阻塞赋值的次序是经过仔细安排的,以使仿真的结果与移位寄存器相一致。虽然该模块可被综合成移位寄存器,但我们不建议使用这种风格的模块来描述时序逻辑。

如果将赋值顺序改成q1,q2,q3,则

按顺序进行的阻塞赋值将使得在下一个时钟上升沿时刻,所有的寄存器输出值都等于输入值d。在每个时钟上升沿,输入值d 将无延时地直接输出到q3

[例5] 不好的用阻塞赋值来描述移位时序逻辑的风格(方式 #3)

module pipeb3 (q3, d, clk);
 output [7:0] q3;
 input [7:0] d;
 input clk;
 reg [7:0] q3, q2, q1;

 always @(posedge clk) q1 = d;
 always @(posedge clk) q2 = q1;
 always @(posedge clk) q3 = q2;

endmodule

本例中,阻塞赋值分别被放在不同的always 块里。仿真时,这些块的先后顺序是随机的,因此可能会出现错误的结果。这是Verilog 中的竞争冒险。按不同的顺序执行这些块将导致不同的结果。但是, 这些代码的综合结果却是正确的流水线寄存器。也就是说,前仿真和后仿真结果可能会不一致。


都看到这儿了,点个赞呗
||
\/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog,for循环通常用来迭代执行一系列的语句块。对于for循环非阻塞赋值,可以使用以下语法进行实现: ``` for (initialization; condition; increment) begin // 非阻塞赋值语句 end ``` 在这个语法,`initialization`是一个初始条件,用来设置循环的起始值。`condition`是一个循环条件,只有在满足条件的情况下,循环的语句块才会被执行。`increment`是一个用于更新循环变量的语句,它会在每次循环迭代之后执行。 在循环的语句块,可以使用非阻塞赋值语句来对信号进行赋值操作。非阻塞赋值使用`<=`符号来表示,例如: ``` signal <= value; ``` 这样,每次循环迭代时,信号都会根据赋值语句来更新。请注意,如果在for循环使用非阻塞赋值,应该确保赋值语句不会产生综合不可预测的结果,否则可能会导致错误的行为。因此,在使用for循环进行赋值时,需要仔细考虑每个赋值语句的执行顺序和依赖关系,以确保正确的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Verilog语法阻塞赋值非阻塞赋值](https://blog.csdn.net/yijiancmy/article/details/104208518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Verilog的阻塞与非阻塞赋值](https://blog.csdn.net/qq_44933149/article/details/121926211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值