verilog - 端口尺寸(12 或 12)与连接尺寸 (6) 不匹配
问题描述
布斯算法是一种乘法运算,将两个数字以两个补码表示法相乘
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, in1, 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, Q_1} <= {sum[5], sum, Q};
2'b1_0: {A, Q, Q_1} <= {difference[5], difference, Q};
default: {A, Q, Q_1} <= {A[5], A, Q};
endcase
count <= count + 1'b1;
end
end
alu adder (sum, A, M);
alu subtracter (difference, A, ~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;
这消除了我的编译警告,但您需要确定这些信号的正确宽度。
推荐阅读
- java - Apache Beam GenerateSequence 不会以指定的速率发射元素
- python - 如何在 lambda 中为 tkinter 按钮分配变量
- node.js - Node.js 12.x 的最佳 --lib 选项
- algorithm - 确定性选择的时间复杂度
- jenkins - 仅在主节点上签出和运行 SCM 管道
- javascript - 在 selenium 测试中使用 javascript 执行程序时 sendkeys 不起作用
- linux - 自动化设置项
- java - 如何将删除的值添加到新数组中并打印它们
- r - 如何将数据框中每一行的列值传递给 R 中的自定义函数?
- sql - 在多个表中使用多个相互依赖的 CROSS-APPLY