我正在尝试根据设计编写乘数。它由两个 16 位输入组成,单个加法器用于计算部分乘积。一个输入的 LSB 与另一个输入的 16 位进行“与”运算,并且与门的输出重复地与前一个输出相加。它的 Verilog 代码如下,但我似乎无法让输出正常工作。
module datapath(output reg [31:15]p_high,
output reg [14:0]p_low,
input [15:0]x, y,
input clk); // reset, start, x_ce, y_ce, y_load_en, p_reset,
//output done);
reg [15:0]q0;
reg [15:0]q1;
reg [15:0]and_output;
reg [16:0]sum, prev_sum;
reg d_in;
reg [3:0] count_er;
initial
begin
count_er <= 0;
sum <= 17'b0;
prev_sum <= 17'b0;
end
always@(posedge clk)
begin
q0 <= y;
q1 <= x;
and_output <= q0[count_er] & q1;
sum <= and_output + prev_sum;
prev_sum <= sum;
p_high <= sum;
d_in <= p_high[15];
p_low[14] <= d_in;
p_low <= p_low >> 1;
count_er <= count_er + 1;
end
endmodule
我创建了一个测试台来测试电路,我看到的第一个问题是,AND 操作没有按我的意愿工作。x 操作数的 16 位与 y 操作数的 LSB 进行“与”运算。y 操作数在每个时钟周期后移动一位,并通过连续添加部分乘积来计算最终乘积。
但是,我从 sum 和 prev_sum 行开始遇到问题,它们的输出显示为 xxxxxxxxxxxx。