【问题标题】:Verilog assignments in a sequential alwaysVerilog 分配顺序总是
【发布时间】:2015-02-22 03:13:20
【问题描述】:

我知道我应该在顺序总是分配中使用非阻塞分配。但是,我不小心在我的部分代码中使用了阻塞赋值,这里是:

reg tb_strobe = 0;
reg [9:0] tb_strobe_cnt = 0;
reg tb_sync = 0;

always@(posedge tb_clkh)
begin
    if (~tb_resetl) begin
        tb_strobe     <= 0;
        tb_strobe_cnt <= 0;
        tb_sync     <= 0;
    end
    else begin

        if (tb_strobe_cnt == 1022) begin
            tb_strobe <= 1;
            tb_strobe_cnt <= tb_strobe_cnt + 1;
        end else if (tb_strobe_cnt == 1023) begin
            tb_strobe <= 0;
            tb_strobe_cnt <= 0;
        end else begin
            tb_strobe <= 0;
            tb_strobe_cnt <= tb_strobe_cnt + 1;
        end

        if (tb_strobe == 1) begin
            tb_sync = 1;             //  <-- this is the mistakenly used blocking assignment
        end else begin
        end

    end
end

然后我的模拟器的行为无法预测,一旦我将该分配固定为非阻塞分配,它就开始正常工作了!!!

我很好奇上面(在我的特定代码中)有什么问题? 以我使用它的方式,由于我只在代码中调用 tb_sync 一次,我没想到会有任何不可预知的行为...... 并且 tb_sync 没有被分配到代码中的其他任何地方。知道有什么问题吗?

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    非阻塞分配用于防止在同一时钟沿写入和读取同一变量的多个进程之间的竞争条件。只需要一个进程写入,另一个进程在同一时钟沿读取同一变量即可创建该竞赛。您的示例没有显示读取 tb_sync 的过程,但我假设这就是比赛的所在。

    【讨论】:

    • 完美的解释。这很有意义。是的,在另一个过程中,我正在阅读“tb_sync”,这正是问题所在。因为在同一时钟沿,其中一个写入,另一个读取。但是,当我使它成为非阻塞时,写入过程直到最后才会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多