2015-12-03 78 views
1

我想寫陣列乘法器,我有兩個模塊ArrayMultiplier,頂部。 在頂部模塊我有三個數組結果,a1,a2。如何將矢量傳遞到模塊而不更改值?

module Top(); 
    reg [4*5-1:0] a1; 
    reg [5*3-1:0] a2; 
    wire [4*3-1:0] result; 
    integer i,j; 
    initial begin 
    for(i=0;i<4;i=i+1) begin 
     for(j=0;j<5;j=j+1) begin 
     a1[i*5+j]=1'b1; 
     end 
    end 
    for(i=0;i<5;i=i+1) begin 
     for(j=0;j<3;j=j+1) begin 
     a2[i*3+j]=1'b1; 
     end 
    end 
    end 
    ArrayMultiplier #(4,5,3) test(result,a1,a2); 
endmodule 

和ArrayMultiplier:

module ArrayMultiplier(result,a1,a2); 
    parameter a1R=0; 
    parameter a1C=0;//a1C=a2R. 
    parameter a2C=0; 
    output reg[(a1R*a2C)-1:0] result; 
    input [(a1R*a1C)-1:0] a1; 
    input [(a1C*a2C)-1:0] a2; 
    integer i,j,k; 
    initial begin 
    //$display("a1R=%d a1C=%d a2C=%d",a1R,a1C,a2C); 
    for(i=0;i<4;i=i+1) 
     for(j=0;j<5;j=j+1) 
     $display("%d a1=%d ",i,a1[i*5+j]); 
    for(i=0;i<a1R;i=i+1) begin 
     for(j=0;j<a2C;j=j+1) begin 
     result[i*a2C+j]=0; 
     end 
    end 
    for(i=0;i<a1R;i=i+1) begin 
     for(j=0;j<a2C;j=j+1) begin 
     for(k=0;k<a1C;k=k+1) begin 
      result[i*a2C+j]=result[i*a2C+j]+(a1[i*a1C+k]*a2[k*a2C+j]); 
      $display("res=%d a1=%d a2=%d",result[i*a2C+j],a1[i*a1C+k],a2[k*a2C+j]); 
     end 
     end 
    end 
    end 
endmodule 

我已經初始化A1,A2,但是當我通過他們ArrayMultiplier模塊他們只是有x值。 我不知道發生了什麼。

回答

2

您不是覆蓋ArrayMultiplier模塊的參數

默認情況下,像a1Ra1Ca2C參數被初始化爲0,如果這些是實例化模塊,則矢量a1a2創建大小爲零的不覆蓋。

看着你Top模塊,映射a1R=4a1C=5a2C=3,和實例模塊,解決了顯示x的錯誤。模塊實例如下:

ArrayMultiplier #(4,5,3) test(result,a1,a2); 

這可以解決您的問題。有關參數化模塊的更多信息,請參閱Parameterized ModulesModule Parameters in Verilog鏈接。

2

首先,根據你的代碼,你永遠不設置a1Ra1C,或a2C爲0以外的值,在沒什麼意思你ArrayMultiplier將成倍增加(和你的矢量指數是壞的)。請更改ArrayMultiplier中的參數值,或將其從Top模塊傳入。其次,你的乘數可能應該使用[email protected](*)塊,而不是initial塊。

相關問題