如何解决端口大小12 或 12与连接大小 (6) 不匹配
Booth 算法是一种乘法运算,用两个补码表示法将两个数相乘
Booth 乘法器通过编码被广泛用于高性能有符号乘法,从而减少部分乘积的数量
我可以知道如何修改我的 Verilog 编码,因为收到错误消息:
端口大小(12 或 12)与连接大小(6)不匹配
module alu(out,in1,in2);
input [5:0] in1;
input [5:0] in2;
output [11:0] out;
assign out = in1 + in2;
endmodule
module booth(out,in2,clk,start);
parameter width = 6;
input clk,start;
input [5:0] in1; //multiplicand
input [5:0] in2; //multiplier
output [11:0] out; //product
reg [5:0] A,Q,M;
reg Q_1;
reg count;
wire[5:0] sum,difference;
always @(posedge clk)
begin
if (start) begin
A <= 6'b0;
M <= in1;
Q <= in2;
Q_1 <= 1'b0;
count <= 2'b0;
end
else begin
case ({Q[0],Q_1})
2'b0_1: {A,Q_1} <= {sum[5],sum,Q};
2'b1_0: {A,Q_1} <= {difference[5],difference,Q};
default: {A,Q_1} <= {A[5],A,Q};
endcase
count <= count + 1'b1;
end
end
alu adder (sum,M);
alu subtracter (difference,~M);
assign out = {A,Q};
endmodule
`timescale 1ns / 10ps
`define CYCLE 30
module booth_tb;
parameter width = 6;
wire [2*width-1:0] out;
reg [width-1:0] in1;
reg [width-1:0] in2;
reg clk,start;
integer num = 1;
integer i;
integer j;
integer ans;
integer err = 0;
booth booth(.out(out),.in1(in1),.in2(in2),.clk,.start);
initial begin
for(i = (-(1<<width-1)+1); i < (1<<width-1); i = i+1) begin
for(j = (-(1<<width-1)); j < (1<<width-1); j = j+1) begin
in1 = i[width-1:0];
in2 = j[width-1:0];
#`CYCLE;
ans = i * j;
if(out == ans[2*width-1:0])
$display("%d data is correct",num);
else begin
$display("%d data is error %b,correct is %b",num,out,ans[2*width-1:0]);
err = err + 1;
end
num = num + 1;
end
end
if(err == 0) begin
$display("-------------------PASS-------------------");
$display("All data have been generated successfully!");
end else begin
$display("-------------------ERROR-------------------");
$display("There are %d errors!",err);
end
#10 $finish;
end
endmodule
解决方法
如果那是您的确切错误消息,那么它就不是很具体。如果您在 edaplayground 上注册一个免费帐户,您可以在其他模拟器上尝试您的代码。您可能会收到更具体的消息。
当我使用 VCS 编译您的代码时,我收到一条更有帮助的消息:
Warning-[PCWM-W] Port connection width mismatch
"alu adder(sum,A,M);"
The following 6-bit expression is connected to 12-bit port "out" of module
"alu",instance "adder".
Expression: sum
这清楚地表明您的连接错误。您应该只将相同宽度的信号连接在一起。例如,您可以更改:
wire[5:0] sum,difference;
到:
wire[11:0] sum,difference;
这消除了我的编译警告,但您需要决定这些信号的正确宽度应该是多少。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。