Verilog中阻塞与非阻塞的结合

Verilog中阻塞与非阻塞的结合,verilog,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

如果我希望语句并行执行,并且在使用所有其他语句时执行另一个语句,例如:

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
任务读取;
开始
如果(de_if==NOP)开始

dp_op您需要一个状态机。这是使事情按一定顺序发生的标准方法。请记住,使用硬件描述语言与常规编程语言不同……您只是在描述您希望硬件具有的行为


要创建一个状态机,您需要一个状态寄存器,一个或多个触发器,用于跟踪所需事件序列中的位置。触发器应该在上升时钟边缘更新,但其余逻辑可以完全组合。

FYI:您的代码正在等待1个时间单位(阻塞延迟),而不是1个时钟。你想要合成什么吗?@greg时间单位是什么?我怎么知道它代表多少ps?我想知道,所以我知道我需要等待多少组合逻辑在我的codetime_单元和time_精度由“`timescale”设置一些模拟器将其作为命令行编译器选项。我如何知道我的组合逻辑何时准备好被查询以进行下一步?我怎么知道要等待多少时间单位?@OfekRon,组合逻辑的输入通常来自同一时钟域中的另一个触发器。来自同一时钟域之外的输入应通过同步器。只要组合逻辑+时钟到队列(输入驱动触发器)+设置时间的程序延迟小于时钟周期,就没有问题。只需记住将组合逻辑放在带有阻塞(
=
)分配的
始终@
中,将同步逻辑放在带有非阻塞的
始终@({单边敏感列表,例如:posedge clk,negedge rst_n})中(
@Greg是对的,但我担心这可能会让你有更多的问题。你需要学习设计同步数字系统,这是一个需要在这种格式中涵盖的巨大主题。使用像Verilog这样的HDL设计逻辑与编写传统程序有根本的不同。