Verilog 如何删除不需要的输出?
我正在研究一个非常大的模块,其中乘法器和加法器模块只是其中的一个小部分,但它将帮助我在这里表达我的问题 RTL代码:Verilog 如何删除不需要的输出?,verilog,hardware-acceleration,register-transfer-level,Verilog,Hardware Acceleration,Register Transfer Level,我正在研究一个非常大的模块,其中乘法器和加法器模块只是其中的一个小部分,但它将帮助我在这里表达我的问题 RTL代码: module mul_and_add #(parameter BITS = 32, parameter SHIFT = 15 ) ( clk, i_multiplicand, i_multiplier, i_adder, o_result ); input clk; input signed [BITS-1:0] i_multiplicand; i
module mul_and_add #(parameter BITS = 32,
parameter SHIFT = 15
)
(
clk,
i_multiplicand,
i_multiplier,
i_adder,
o_result
);
input clk;
input signed [BITS-1:0] i_multiplicand;
input signed [BITS-1:0] i_multiplier;
input signed [BITS-1:0] i_adder;
output signed [BITS-1:0] o_result;
reg signed [2*BITS-1:0] mul_result;
reg signed [BITS:0] add_result;
wire signed [BITS-1:0] o_result;
always @(posedge clk)
begin
mul_result <= i_multiplicand * i_multiplier;
add_result <= i_adder + (mul_result >> SHIFT);
end
assign o_result = add_result[BITS-1:0];
endmodule
module tb_mul_and_add (
);
parameter BITS = 32;
reg clk;
reg signed [ BITS - 1 : 0 ] i_multiplicand;
reg signed [ BITS - 1 : 0 ] i_multiplier;
reg signed [ BITS - 1 : 0 ] i_adder;
wire signed [ BITS - 1 : 0 ] o_result;
mul_and_add mul_and_add_i (
.clk(clk),
.i_multiplicand(i_multiplicand),
.i_multiplier(i_multiplier),
.i_adder(i_adder),
.o_result(o_result)
);
parameter CLKPERIODE = 10;
initial clk = 1'b1;
always #(CLKPERIODE/2) clk = !clk;
initial begin
i_multiplicand = 32'h00010000;
i_multiplier = 32'h00010000;
i_adder = 32'h00010000;
#30
i_multiplicand = 32'h00008000;
i_multiplier = 32'h00010000;
i_adder = 32'h00020000;
#70
$finish();
end
endmodule
输出:Cadence SimVision
用红色矩形标记的数据是我想要删除的不需要的数据,因为当我多次使用此模块时,在正确的模块之前有许多不需要的数据。因此,当我必须整理数据来绘制图表时,需要经历很多事情
有什么魔术是我不知道的,以摆脱不必要的数据
此外,如果您有更好的优化想法或任何批评意见,请随时分享。更改RTL代码,使
mul_result
成为一条导线,而不是一个周期的计算延迟:
wire signed [2*BITS-1:0] mul_result = i_multiplicand * i_multiplier;
always @(posedge clk) begin
add_result <= i_adder + (mul_result >> SHIFT);
end
wire-signed[2*位-1:0]mul_result=i_乘法器*i_乘法器;
始终@(posedge clk)开始
添加_结果>移位);
结束
更改TB代码以将输入更改与时钟边缘对齐,并使用非阻塞分配来避免争用条件:
initial begin
i_multiplicand = 32'h00010000;
i_multiplier = 32'h00010000;
i_adder = 32'h00010000;
repeat (3) @(posedge clk);
i_multiplicand <= 32'h00008000;
i_multiplier <= 32'h00010000;
i_adder <= 32'h00020000;
#70
$finish();
end
初始开始
i_被乘数=32'h00010000;
i_乘数=32'h00010000;
i_加法器=32'h00010000;
重复(3)@(posedge clk);
i_multipliand@toolici_multipliand
输入总是相同的,每次都会有不同的i_multipliand
。在那之后,总会有一个新的变量在乘法之后被加上,然后只有我想要我的输出。我希望这能回答你的疑问。“因此,当我必须整理数据以绘制图表时,需要做很多工作。”如果你继续从事这一领域,你应该开始编写自检测试台。在这种情况下,标准程序是生成一个“有效”信号,指示输出何时正确。不要使用@Oldfart,我认为这是一个非常好的建议。你能给我一个例子,一个参考或者一个教程的链接吗?任何有助于我进一步理解的东西。以下是我写的一些关于自检测试台的文章:正如在文章中所述,预测结果可能和自己编写代码一样困难。另一种方法是使用具有输入和输出模式的文件,这些模式可以使用外部生成,例如C/C++。
module mul_and_add #(
parameter BITS = 32,
parameter SHIFT = 15
)
(
input clk,
input signed [BITS-1:0] i_multiplicand,
input signed [BITS-1:0] i_multiplier,
input signed [BITS-1:0] i_adder,
output signed [BITS-1:0] o_result
);
reg signed [BITS:0] add_result;
wire signed [2*BITS-1:0] mul_result = i_multiplicand * i_multiplier;
always @(posedge clk) begin
add_result <= i_adder + (mul_result >> SHIFT);
end
assign o_result = add_result[BITS-1:0];
endmodule