Verilog 如何构建模块链?

Verilog 如何构建模块链?,verilog,system-verilog,Verilog,System Verilog,我在构建模块链时遇到问题。我可以手动连接列出所有模块的模型,但需要更简洁的表示。以下代码已尝试但不起作用?如何更正代码 module network( input signed [31:0] xi, output signed [31:0] yo, input clk, input reset ); wire signed [31:0] x0, x1, x2, y0, y1, y2, xo; wire [3:1] t; //wor

我在构建模块链时遇到问题。我可以手动连接列出所有模块的模型,但需要更简洁的表示。以下代码已尝试但不起作用?如何更正代码

module network(
    input signed [31:0] xi,
    output signed [31:0] yo,
    input clk,
    input reset
    );

    wire signed [31:0] x0, x1, x2, y0, y1, y2, xo;
    wire [3:1] t;
    //working code for chain of pe
//   pe u0(xi, x0, 0, y0, clk, reset);  
//   pe u1(x0, x1, y0, y1, clk, reset);
//   pe u2(x1, x2, y1, y2, clk, reset);
//   pe u3(x2, xo, y2, yo, clk, reset);
    //chain of array not working! how!
    pe p[1:4] ((xi,t), (t, x), (0, t), (t,yo),clk,reset); <- want to improve
endmodule
模块网络(
输入签名[31:0]席,
输出签名为[31:0]yo,
输入时钟,
输入复位
);
符号为[31:0]x0,x1,x2,y0,y1,y2,xo的导线;
金属丝[3:1]t;
//聚乙烯链工作规范
//pe u0(xi、x0、0、y0、clk、复位);
//pe u1(x0,x1,y0,y1,时钟,复位);
//pe u2(x1、x2、y1、y2、时钟、复位);
//pe u3(x2、xo、y2、yo、clk、复位);
//阵列链不工作!怎样!

pep[1:4]((xi,t),(t,x),(0,t),(t,yo),时钟,复位) 试试这个。它应该适用于所有版本的Verilog。在本例中,参数PE_NUM必须是值为2或更大的int。如果需要1个pe实例(需要Verilog-2001或SystemVerilog),则必须使用generate块。当PE_NUM变大时,某些模拟器可能会受到内存限制(例如2**16)

以下是生成的示例:

/*Verilog-2001 or SystemVerilog*/
module network(
        input signed [31:0] xi,
        output signed [31:0] yo,
        input clk,
        input reset
        );
    parameter PE_NUM = 4; // no limitation
    wire signed [31:0] xo;
    generate
        if(PE_NUM <2) begin
            pe p (xi, xo, 32'b0, yo, clk,reset);
        end
        else begin
            wire signed [0:PE_NUM-2] [31:0] xN;
            wire signed [0:PE_NUM-2] [31:0] yN;
            pe p[0:PE_NUM-1] ({xi,xN}, {xN,xo}, {32'b0,yN}, {yN,yo}, clk,reset);
        end
    endgenerate
endmodule
/*Verilog-2001或SystemVerilog*/
模块网络(
输入签名[31:0]席,
输出签名为[31:0]yo,
输入时钟,
输入复位
);
参数PE_NUM=4;//无限制
签署[31:0]xo的电报;
生成

如果(PE_NUM请尝试此操作。它应适用于所有版本的Verilog。在这种情况下,参数PE_NUM必须是一个值为2或更多的int。如果需要1个PE实例,则必须使用生成块,这需要Verilog-2001或SystemVerilog。当PE_NUM变大时,某些模拟器可能会遇到内存限制(例如2**16)

以下是生成的示例:

/*Verilog-2001 or SystemVerilog*/
module network(
        input signed [31:0] xi,
        output signed [31:0] yo,
        input clk,
        input reset
        );
    parameter PE_NUM = 4; // no limitation
    wire signed [31:0] xo;
    generate
        if(PE_NUM <2) begin
            pe p (xi, xo, 32'b0, yo, clk,reset);
        end
        else begin
            wire signed [0:PE_NUM-2] [31:0] xN;
            wire signed [0:PE_NUM-2] [31:0] yN;
            pe p[0:PE_NUM-1] ({xi,xN}, {xN,xo}, {32'b0,yN}, {yN,yo}, clk,reset);
        end
    endgenerate
endmodule
/*Verilog-2001或SystemVerilog*/
模块网络(
输入签名[31:0]席,
输出签名为[31:0]yo,
输入时钟,
输入复位
);
参数PE_NUM=4;//无限制
签署[31:0]xo的电报;
生成

if(PE_NUM)如果您使用的是Verilog-2001或更高版本,您可以使用“generate”语句来实现这一点。您可能需要对xk和yk信号进行矢量化(k=0,1,2)。只需查找generate语句。我发现可以修改代码以适应连接网络。“wire[32*3:1]t,s;”和“pep[1:3'((t,xi),((xo,t),(s,yi),(yo,s),clk,reset);”。无论如何,感谢您的评论。连接列表起初很难理解,但似乎很符合逻辑。如果您使用的是Verilog-2001或更高版本,则可以使用“generate”语句来实现这一点。不过,您可能必须对xk和yk信号进行矢量化(k=0,1,2)。只需查找generate语句。我发现代码可以修改以适应连接网络。“wire[32*3:1]t,s;”和“pep[1:3'((t,xi),((xo,t),(s,yi),(yo,s),clk,reset);”。无论如何,感谢您的评论。连接列表起初很难理解,但似乎相当合乎逻辑。语法
wire[0:a][b:0]名称
mean?我只见过
wire[b:0]name[0:a]
它的意思是双重备份。声明左侧的任何
[]
都是打包的,右侧的任何
[]
都是解包的。有关Verilog和SystemVerilog的详细信息,请参阅IEEE LRMs。我假设这是“双重打包”的打字错误?似乎暗示
范围(您称之为打包的)只允许出现一次,至少在verilog 2005中是这样。暗示这是SystemVerilog中的一个新功能语法
wire[0:a][b:0]name
的意思是什么?我只见过
wire[b:0]name[0:a]
它的意思是双面的。任何
[]
在声明的左侧是打包的,右侧的任何
[]
都是解包的。请参考IEEE LRMs中的Verilog和SystemVerilog中的mote详细信息。我假设这是“双重打包”的拼写错误?似乎表明
范围是打包的(您称之为打包的)只允许出现一次,至少在verilog 2005中是这样。这是SystemVerilog的一个新功能