这是verilog竞争条件吗?

Is this a verilog race condition?

此代码中是否存在会产生竞争条件的内容?如果我运行它原样,好像挂了。如果我进行下面提到的小改动,它会按预期执行。

这不是完整的代码,我只是想 post 足以看看是否有人识别出一些明显的东西。我很难过。我可以 post 整个代码是有人想要的。谢谢

wire clk;        

// core
reg src_in; // 0 = ram, 1 = uart
initial src_in = 1'b1; 
reg src_out;
initial src_out = 1'b1;
reg src_in_;
reg src_out_;
wire [7:0] I = src_in ? term_in : data_read;
wire emit;

always @* begin         

    // //src_in
    case(I)
        "}" :       src_in_ = 1'b1; // 1 = uart 
        "]" :       src_in_ = 1'b0; // 0 = ram
        default:    src_in_ = src_in; //!!!!!!!!!! if I change this to 1'b0 there is no problem
    endcase         


    // //src_out
    case(I)
        "{" :       src_out_ = 1'b1; // 1 = uart 
        "[" :       src_out_ = 1'b0; // 0 = ram
        default:    src_out_ = src_out; //!!!!!!!!!! if I change this to 1'b0 there is no problem
    endcase     

end

always @(posedge clk) begin
    {R, L} <= {R_, L_};
    {src_in, src_out} <= {src_in_, src_out_};
end

如果你的代码 'hangs' 你有一个组合循环,而不是竞争条件。
因此在某个地方你有一系列 a=b; b=c; c=~d; d=a;

我没有立即在上面的代码中看到一个,所以我怀疑它在您没有显示的代码中。

找到它们的一种方法是单步执行代码。

对于大型设计来说,这可能会非常乏味,因此您可以尝试的另一种方法是在您怀疑有问题的代码中添加延迟(例如添加 #5;)并检查波形,那只是为了调试!!
在那种情况下,请确保您的时钟慢得多。例如使用#1000。

这是我制作的示例波形,其中包含一个包含 #5 的组合循环 (a=~b&clk; b=a;):