デザインに基づいて乗数を書き込もうとしています。これは2つの16ビット入力で構成され、1つの加算器を使用して部分積を計算します。一方の入力のLSBはもう一方の入力の16ビットとAND演算され、ANDゲートの出力は前の出力に繰り返し加算されます。そのための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オペランドは、クロックサイクルごとに1ビットずつシフトされ、部分積を連続して加算して最終積が計算されます。
ただし、sum行とprev_sum行から開始するのに問題があり、それらの出力はxxxxxxxxxxxxとして表示されています。