ZYNQ学习:Verilog语言心得(六)

当 always语句中对变量反复赋值的时候,会发生什么后果?

实验测试一下:

RTL代码

module always_test(
    input            sys_rst_n ,
    input            sys_clk   ,
    output reg [2:0] led      
    );
    
    
    //led_0 连续写两个反转
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            led[0] <= 1'b0;
        else begin
            led[0] <= !led[0];
            led[0] <= !led[0];
            end
        end

    //led_1 连续赋两次不同的值
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            led[1] <= 1'b0;
        else begin
            led[1] <= 1'b1;
            led[1] <= 1'b0;
            end
        end

    //led_2 连续赋三次不同的值
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(!sys_rst_n)
            led[2] <= 1'b0;
        else begin
            led[2] <= 1'b1;
            led[2] <= 1'b0;
            led[2] <= 1'bz;
            end
        end


    endmodule

tb代码:

`timescale 1ns/1ns
module tb_always_test();

    parameter CLK_PERIOD = 20;
    
    reg        sys_rst_n ;
    reg        sys_clk   ;
    wire [2:0] led       ;
    
    initial begin
        sys_rst_n <= 1'b0;
        sys_clk   <= 1'b0;
        #10
        sys_rst_n <= 1'b1;
        end
    always #(CLK_PERIOD/2)
        sys_clk <= !sys_clk;
     
    always_test u_always_test(
        .sys_rst_n (sys_rst_n),
        .sys_clk   (sys_clk  ),
        .led       (led      )
        );

    endmodule

测试结果波形图如下:

分析

1.LED[0],并没有翻转两次而是只反转了一次

2.LED[1],取了最后赋的值0

3.LED[2],取了最后赋的值z

结论一个always块内使用非阻塞赋值,对同一变量多次赋值,从时间上来看是并行的,但是从结果上来看,会采用最后一次赋值,在编写代码的时候应当避免这种无效多次赋值,这样会导致逻辑混乱 。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值