Verilog 如何交替两个街区?

Verilog 如何交替两个街区?,verilog,system-verilog,Verilog,System Verilog,我想设计一个简单的Verilog代码,它包含两个始终块,交替执行,就像握手一样。我想使用两个标志,do_A和do_B来控制两个块,block_A和block_B。预期结果必须是ABABAB。。。有没有办法更正以下代码?谢谢你帮助我 module tb; reg clock, reset, do_A, do_B; initial begin clock = 0; reset = 0; #50; reset = 150; #50; reset = 0; end al

我想设计一个简单的Verilog代码,它包含两个始终块,交替执行,就像握手一样。我想使用两个标志,do_A和do_B来控制两个块,block_A和block_B。预期结果必须是ABABAB。。。有没有办法更正以下代码?谢谢你帮助我

    module tb;
    reg clock, reset, do_A, do_B;

    initial begin clock = 0; reset = 0; #50; reset = 150; #50; reset = 0; end
    always #50 clock = ~clock;

    always @(posedge clock) begin: block_A
        if (reset) do_B <= 0;
        else if (do_A) begin
            do_B <= 0;
            $display("A");
        end 
    end

    always @(posedge clock) begin:block_B
        if (reset) do_A <= 1;
        else if (do_B) begin
            do_A <= 0;
            $display("B");
        end 
    end
endmodule
模块tb;
注册时钟、复位、执行A、执行B;
初始开始时钟=0;重置=0#50; 重置=150#50; 重置=0;结束
总是#50钟=~钟;
始终@(posedge时钟)开始:块A

if(reset)do_B首先
reset=150看起来很奇怪(打字错误?)。不过,它在这种情况下起作用

您在第一个连续的
始终
中有另一个打字错误-您(似乎)想写的是:

else if (do_A) begin
    do_B <= 1;
    $display("A");
end 
重置后解除评估
执行A=1
;然后,假设您修复了前面的打字错误,
do_B
将变为1,这将导致
do_A
变为0。达到此状态后,
do_A
将一直保持在0,直到您重置所有内容

以下添加操作应解决此问题(对于第一个
始终
块也是如此):

始终@(posedge时钟)开始:块B 如果(重置)执行以下操作:
else if (do_A) begin
    do_B <= 1;
    $display("A");
end 
always @(posedge clock) begin:block_B
    if (reset) do_A <= 1;
    else if (do_B) begin
        do_A <= 0;
        $display("B");
    end 
end
always @(posedge clock) begin:block_B
    if (reset) do_A <= 1;
    else if (do_B) begin
        do_A <= 0;
        $display("B");
    end
    else do_A <= 1; 
end