这是一种verilog竞争条件吗?
这段代码是否会产生竞争条件?如果我按原样运行,它似乎会挂起。如果我做了下面提到的小改动,它将按预期执行 这不是完整的代码,我只是想发布足够多的信息,看看有没有人能识别出一些明显的东西。我被难住了。如果有人想要,我可以发布整个代码。谢谢这是一种verilog竞争条件吗?,verilog,Verilog,这段代码是否会产生竞争条件?如果我按原样运行,它似乎会挂起。如果我做了下面提到的小改动,它将按预期执行 这不是完整的代码,我只是想发布足够多的信息,看看有没有人能识别出一些明显的东西。我被难住了。如果有人想要,我可以发布整个代码。谢谢 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_
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
wire-clk;
//核心
reg src_in;//0=ram,1=uart
初始src_in=1'b1;
注册src_out;
初始src_out=1'b1;
reg src_in_;
reg src_out_;
导线[7:0]I=src\u in?术语_in:数据_读取;
线发射;
总是开始
////src_in
案例(一)
“}”:src_in_u=1'b1;//1=通用异步收发器
“]”:src_in_u=1'b0;//0=ram
默认值:src_in=src_in;/!!!!!!!!!!如果我把它改成1'b0,就没有问题了
尾声
////src\u out
案例(一)
“{”:src_out_=1'b1;//1=uart
“[”:src\u out\uu=1'b0;//0=ram
默认值:src_out=src_out;/!!!!!!!!!!!如果我将此更改为1'b0,则没有问题
尾声
结束
始终@(posedge clk)开始
{R,L}如果你的代码“挂起”,你有一个组合循环,而不是竞争条件。
因此,在某个地方有一系列a=b;b=c;c=~d;d=a;
我没有立即在上面的代码中看到一个,所以我怀疑它在您没有显示的代码中
找到它们的一种方法是单步执行代码
对于一个大的设计来说,这可能是非常乏味的,所以你可以尝试的另一种方法是在你怀疑问题所在的代码中散布延迟(例如,添加#5;
)并检查波形,这仅用于调试!!
在这种情况下,请确保您的时钟慢得多。例如,使用#1000
这是一个示例波形,由组合回路(a=~b&clk;b=a;
)构成,其中包含一个#5:
看起来并不是所有的代码都是这样。里面没有太多可能导致挂起的代码。我可以推测一个零延迟循环来自“scr\u in->scr\u in->…scr\u out->…”I`chain。但是没有足够的代码来查看它。检查变量名称的拼写。下划线很容易被忽略。