首页 > 解决方案 > 端口尺寸(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

标签: verilogmodelsim

解决方案


如果那是您的确切错误消息,那么它不是很具体。如果您在 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;

这消除了我的编译警告,但您需要确定这些信号的正确宽度。


推荐阅读