在Verilog HDL中,如何在修改单个位时强制执行寄存器文件的其余部分?如下例所示,
reg [31:0] result;
reg [31:0] next_result;
reg [4:0] count;
wire done;
//some code here...
result <= 32'b0;
always @* begin
if(done==1'b1) begin
next_result[count] <= 1'b1;
end
end
always @(posedge clock) begin
result <= next_result;
//the rest of the sequential part, in which count increments...
end
事实证明,结果在几个周期后包含大量x
(未知)值,这意味着在修改result[count]
时寄存器文件不会保持不变。奇怪的是,这个问题只在我合成时出现,并且一切都很好用于模拟目的。我想知道是否有某种方法告诉合成器我想“强制执行”而不是更改寄存器文件的其余部分。
答案 0 :(得分:3)
您永远不会分配组合循环中的所有位。你有一个浮动任务result <= 32'b0;
我很惊讶这个编译。还有一个隐含的锁存器,没有在else语句中分配next_result,即当done = 0 next_result将保持其值。
尝试:
always @* begin
if(done==1'b1) begin
next_result = result;
next_result[count] = 1'b1;
end
else begin
next_result = result;
end
end
OR
always @* begin
next_result = result;
if(done==1'b1) begin
next_result[count] = 1'b1;
end
end
您还在组合循环中使用了非阻塞<=
分配。