这是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;
):
此代码中是否存在会产生竞争条件的内容?如果我运行它原样,好像挂了。如果我进行下面提到的小改动,它会按预期执行。
这不是完整的代码,我只是想 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;
):