如何在Verilog中进行矩阵乘法?

时间:2016-03-04 06:59:22

标签: verilog fpga hdl asic iverilog

我试图将1x3 * 3X64矩阵乘以这里,因为矩阵中的每个值都是十进制数,所以对于每个值,我总共访问4位为4x644每次1}}每行的位。

我试图概括它。

矩阵的格式为1x3 [2,4,3]&

3*64(64 decimal value in each row)

  

第1行[111111111111111111111111111111(64)]

     

第2行[11111111(8)22222222(8)..... 88888888(8)]

     

第3行[1234567812345678 .................. 12345678]

我试过的代码

always@(h1,h2,h3)
        begin
z1 =((w0[3:0]*h1[3:0])+(w1[3:0]*h2[3:0])+(w2[3:0]*h3[3:0]));
z2=((w0[3:0]*h1[7:4])+(w1[3:0]*h2[7:4])+(w2[3:0]*h3[7:4]));

.
.
.
.
.   
z64=((w0[3:0]*h1[255:252])+(w1[3:0]*h2[255:252])+(w2[3:0]*h3[255:252]));


    end

        endmodule 

我需要这种广义形式..

我遇到错误:

  

错误:HDLC编译器:110 - “mat.v”行36最低有效位操作数   在部分选择矢量线'h1'是非法的

for(i=3;i<255;i=i+4)
        begin
            for(j=0;j<255;j=j+4)

            begin
                z[i:j]=((w0[3:0]*(h1[i:j]))+(w1[3:0]*h2[i:j])+(w2[0]*h3[i:j]));

            end 

1 个答案:

答案 0 :(得分:0)

Verilog中的零件选择必须具有常量边界。 h1[i:j]是非法的。 h1[i +: 4]是合法的,与非法h1[i:(i+3)]相同。 (并h1[i+3 -: 4]表示与非法h1[(i+3):i]相同。

然而,使用二维数组不能更好地解决您的问题吗?例如:

reg [3:0] h1 [0:63];