在Verilog中结合阻塞和非阻塞

时间:2014-05-07 20:02:59

标签: verilog

如果我想要并行发生语句,并且在完成所有其他语句时发生另一个语句,例如:

task read;
 begin
    if (de_if==NOP) begin 
        dp_op    <= 3'b000;
        dp_phase =  EXEC;
    end
    else begin
        if (de_if==EXEC_THEN) begin
            dp_const <= de_src3[0];
            dp_src   <= de_src3;
            dp_op    <= {NOP,de_ctrl3};
            dp_dest  <= de_dest1;
        end
        else if (get_value(de_ctrl1,de_src1)==dp_mem[de_src2]) begin
            dp_const <= de_src3[0];
            dp_src   <= de_src3;
            dp_op    <= {NOP,de_ctrl3};
            dp_dest  <= de_dest1;
        end 
        else begin
            dp_const <= de_src4[0];
            dp_src   <= de_src4;
            dp_op    <= {NOP,de_ctrl4};
            dp_dest  <= de_dest2;
        end
        #1 dp_phase=READ;
    end
 end
endtask

在此代码中,我希望语句dp_phase = READ仅在完成所有其他分配后执行,我该怎么做?

你可以看到我所做的是在作业前等待1个钟,但我不知道这是不是这样做了......

1 个答案:

答案 0 :(得分:1)

你需要一台状态机。这是以某种顺序使事情发生的规范方式。请记住,使用硬件描述语言并不像常规编程语言...您只是描述您希望硬件具有的行为类型。

要制作状态机,您需要一个状态寄存器,一个或多个触发器,用于跟踪您在所需事件序列中的位置。触发器应该在时钟上升沿更新,但逻辑的其余部分可以纯粹是组合。