合成中的Verilog矩阵乘法误差

时间:2016-02-24 15:58:33

标签: verilog xilinx hdl

我在Verilog上写了32行32乘法。我试图合成代码,但它给出了一个错误,说信号连接到多个驱动程序。下面的代码不完整但给出了相同的错误。我是Verilog的新手,我不知道如何解决这个问题。你能就如何解决这个问题提出建议吗?我使用的是Xillinx 14.5版,FPGA是virtex 5。

我使用的是内置乘法器和内置加法器。 这是代码:

module matrixMult(Arow, Bcol,CLK, AxB);
    input [1023:0] Arow;
    input [1023:0] Bcol;
    input          CLK;
    output [31:0] AxB;

     wire [1023:0] Arow;
     wire [1023:0] Bcol;
     wire [1024:0] ab;
     wire [1024:0] AxB;


     // multiplication
     ip32Mult a1b1(CLK, ab[1023:992], Arow[1023:992],Bcol[1023:992]);
     ip32Mult a2b2(CLK, ab[991:960], Arow[991:960],Bcol[992:960]);

     // addition // no clock enable
     ip32Add ab1( AxB[31:0], ab[1023:992], ab[991:960]);

endmodule

错误:

ERROR:Xst:528 - Multi-source in Unit <matrixMult> on signal <ab<992>>; this signal is connected to multiple drivers.

其他信息: ip32Add的外观如何

module ip32Add (
  clk, s, a, b
)/* synthesis syn_black_box syn_noprune=1 */;
  input clk;
  output [31 : 0] s;
  input [31 : 0] a;
  input [31 : 0] b;
  ....

ip32Mult的外观如下:

module ip32Mult (
  clk, p, a, b
)/* synthesis syn_black_box syn_noprune=1 */;
  input clk;
  output [31 : 0] p;
  input [31 : 0] a;
  input [31 : 0] b;
  ...

2 个答案:

答案 0 :(得分:3)

ip32Add 标头有一个clk引脚,但 ab1 实例却没有。因此,按顺序连接时,AxB[31:0]clk相关联,ab[1023:992]与输出s相关联。如果实例 a1b1 ab[1023:992]也会连接到输出p。因此ab[1023:992]有两个驱动程序。例如, ab1 可能会出现警告,例如宽度不匹配且b未连接。

我建议按名称(例如:.portname(netname))而不是按订单连接您的端口。按名称连接顺序无关紧要,更明确。如果时钟不重要但引脚确实存在, ab1 应如下所示:

ip32Add ab1( .s(AxB[31:0]), .a(ab[1023:992]), .b(ab[991:960]), .clk() );

答案 1 :(得分:0)

评论时间太长,但不能被视为完整答案。 你能用现代风格重新定义你的模块:

setTimeout

你有这条线:

module matrixMult(
  input [1023:0] Arow,
  input [1023:0] Bcol,
  input          CLK,
  output [31:0]  AxB );


 wire [1024:0] ab;

哪个不确定是否会导致它为1位,或者前面的语句(32位宽)是否会赢。

如果问题还可以显示标题:

,将会很有帮助
 wire AxB;

由于错误表明ab连接可能连接到两个驱动程序而不是输入和输出。