我写了一段代码,根据我提供的数字以及我用来移动数字的其他数据,返回商和提醒。
我现在面临的问题是,如果我一个接一个地测试更多的值,我就无法保持良好的商数
我需要一种方法来初始化我的 cat 寄存器,这样我就不会再从先前的计算中获得剩余值。
以下是我所谈论的代码:
module divide(
input [7:0] a, b,
input [3:0] counter, msb,
output reg [7:0] q,
output reg [7:0] r
);
always @(*) begin
for(i = 0; i < counter + 1 ; i = i+1) begin
sum = s_a + s_b; //previously calculated values
if(sum[8-msb] == 1) begin
assign s_a = s_a;
assign s_b = s_b >>> 1;
cat[counter - i] = 1'b0;
end
else begin
assign s_a = sum;
assign s_b = s_b >>> 1;
cat[counter - i] = 1'b1;
end
assign r = s_a;
assign q = cat;
end
end
endmodule
注意:我已经声明了此代码中的所有寄存器,但出于某种目的,我无法在此声明它们。
答案 0 :(得分:3)
您不在assign
或always
块内使用initial
。
cat的赋值是组合因此它不是触发器,即没有复位。它是reg
类型的事实与硬件无关,而是与模拟器优化无关。
我会把它写成(没有做出功能改动):
module divide#(
parameter DATA_W = 8
)(
input [7:0] a, b,
input [3:0] counter, msb,
output reg [7:0] q,
output reg [7:0] r
);
//Definitions
reg [DATA_W-1:0] sum;
reg [DATA_W-1:0] s_a;
reg [DATA_W-1:0] s_b;
integer i;
always @* begin
for(i = 0; i < (counter + 1); i = i+1) begin
sum = s_a + s_b; //previously calculated values
if(sum[8-msb] == 1'b1) begin
s_a = s_a;
s_b = s_b >>> 1;
cat[counter - i] = 1'b0;
end
else begin
s_a = sum;
s_b = s_b >>> 1;
cat[counter - i] = 1'b1;
end
r = s_a;
q = cat;
end
end
endmodule
您有以下一行:
sum = s_a + s_b; //previously calculated values
这里没有包含任何触发器,除非你有隐含的锁存器,这是真正要避免的,没有内存或状态。即没有先前计算的值。
您可能想要添加触发器并使用多个时钟周期来计算结果,而不是组合块。
而不是always @*
尝试:
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
s_a <= 'b0; //Reset Value
end
else begin
s_a <= next value; //Normal logic
end
end