Verilog 可变模块安装

Verilog 可变模块安装,verilog,system-verilog,instantiation,xilinx,vivado,Verilog,System Verilog,Instantiation,Xilinx,Vivado,我正在做一个项目,如果可能的话,我想实现变量模块实例化。这是我的项目中的一个例子,我正在生成一组我设计的乘法器模块。要更改数据类型(即整型->浮点->定点),我需要更改正在调用的模块,有没有办法通过修改代码轻松做到这一点?我试过寻找答案,但似乎我没有找到答案 我不确定这有多重要,但我正在Vivado 2019.2中为Pynq-Z2编写代码 我的旧代码: generate genvar m ; for(m=0;m<`inputPortCount;m=m+1)begin

我正在做一个项目,如果可能的话,我想实现变量模块实例化。这是我的项目中的一个例子,我正在生成一组我设计的乘法器模块。要更改数据类型(即整型->浮点->定点),我需要更改正在调用的模块,有没有办法通过修改代码轻松做到这一点?我试过寻找答案,但似乎我没有找到答案

我不确定这有多重要,但我正在Vivado 2019.2中为Pynq-Z2编写代码

我的旧代码:

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        integercomputeBlockPynq m_computeBlock_in(i/o assign);
    end
endgenerate
`define int     1
`define float   0
`define fixed   0
generate
    genvar m ;
    if(`int&&!(`float||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            integercomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`float&&!(`int||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`fixed&&!(`int||`float))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlock m_computeBlock_in(i/o assign);
        end
    end
endgenerate
生成
genvar m;
对于(m=0;m我新实现的代码:

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        integercomputeBlockPynq m_computeBlock_in(i/o assign);
    end
endgenerate
`define int     1
`define float   0
`define fixed   0
generate
    genvar m ;
    if(`int&&!(`float||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            integercomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`float&&!(`int||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`fixed&&!(`int||`float))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlock m_computeBlock_in(i/o assign);
        end
    end
endgenerate
`define int 1
`定义浮点0
`定义固定的0
生成
genvar m;
如果(`int&&!(`float | | ` fixed))开始
对于(m=0;m我新实现的代码:

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        integercomputeBlockPynq m_computeBlock_in(i/o assign);
    end
endgenerate
`define int     1
`define float   0
`define fixed   0
generate
    genvar m ;
    if(`int&&!(`float||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            integercomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`float&&!(`int||`fixed))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlockPynq m_computeBlock_in(i/o assign);
        end
    end
    if(`fixed&&!(`int||`float))begin
        for(m=0;m<`inputPortCount;m=m+1)begin
            floatcomputeBlock m_computeBlock_in(i/o assign);
        end
    end
endgenerate
`define int 1
`定义浮点0
`定义固定的0
生成
genvar m;
如果(`int&&!(`float | | ` fixed))开始
对于(m=0;m以下的模式,应该有一个稍微优雅的版本:
`定义模式

`ifdef MODE_INT
    `define module_name integercomputeBlockPynq 
`elsif MODE_FLOAT
    `define module_name floatcomputeBlockPynq 
`elsif MODE_FIXED
    `define module_name floatcomputeBlock 
`endif

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        `module_name m_computeBlock_in(1'b1);
    end
endgenerate
`ifdef模式\u INT
`定义模块名称integercomputeBlockPynq
`elsif模式浮点数
`定义模块名称floatcomputeBlockPynq
`elsif模式_已修复
`定义模块名称floatcomputeBlock
`恩迪夫
生成
genvar m;
对于(m=0;m以下的模式,应该有一个稍微优雅的版本:
`定义模式

`ifdef MODE_INT
    `define module_name integercomputeBlockPynq 
`elsif MODE_FLOAT
    `define module_name floatcomputeBlockPynq 
`elsif MODE_FIXED
    `define module_name floatcomputeBlock 
`endif

generate
    genvar m ;
    for(m=0;m<`inputPortCount;m=m+1)begin
        `module_name m_computeBlock_in(1'b1);
    end
endgenerate
`ifdef模式\u INT
`定义模块名称integercomputeBlockPynq
`elsif模式浮点数
`定义模块名称floatcomputeBlockPynq
`elsif模式_已修复
`定义模块名称floatcomputeBlock
`恩迪夫
生成
genvar m;

对于(m=0;m,在我看来,下面的代码看起来更简洁,可读性更强,因为它只有一个循环

但有一点是,您的
if
条件有点重叠,因此我认为下面的内容将更好地反映它们

现在,这里最好使用参数而不是宏。至少有两个原因:

  • 参数是有范围的,如果这样做,您将避免可能的全局空间冲突

  • 您可以很容易地用一组不同的参数实例化这个模块,但要使所有文本宏在verilog中正常工作,您将很难

  • 下面是我的例子:

    parameter isInt=1; // i guess, if it is not int, it is float
    parameter isFixed=0;
    parameter inputPortCount = 4; // or whatever number.
     
    generate
        genvar m ;
            for(m=0;m<inputPortCount;m=m+1) begin: loop
               if (isFixed)
                   floatcomputeBlock m_computeBlock_in(i/o assign);
               else if (isInt)
                   integercomputeBlockPynq m_computeBlock_in(i/o assign);
               else 
                   floatcomputeBlockPynq m_computeBlock_in(i/o assign);
             end
    endgenerate
    
    参数isInt=1;//我想,如果它不是int,那么它就是float
    参数isFixed=0;
    参数inputPortCount=4;//或任意数字。
    生成
    genvar m;
    
    对于(m=0;m,在我看来,下面的代码看起来更简洁,可读性更强,因为它只有一个循环

    但有一点是,您的
    if
    条件有点重叠,因此我认为下面的内容将更好地反映它们

    现在,这里最好使用参数而不是宏。至少有两个原因:

  • 参数是有范围的,如果这样做,您将避免可能的全局空间冲突

  • 您可以很容易地用一组不同的参数实例化这个模块,但要使所有文本宏在verilog中正常工作,您将很难

  • 下面是我的例子:

    parameter isInt=1; // i guess, if it is not int, it is float
    parameter isFixed=0;
    parameter inputPortCount = 4; // or whatever number.
     
    generate
        genvar m ;
            for(m=0;m<inputPortCount;m=m+1) begin: loop
               if (isFixed)
                   floatcomputeBlock m_computeBlock_in(i/o assign);
               else if (isInt)
                   integercomputeBlockPynq m_computeBlock_in(i/o assign);
               else 
                   floatcomputeBlockPynq m_computeBlock_in(i/o assign);
             end
    endgenerate
    
    参数isInt=1;//我想,如果它不是int,那么它就是float
    参数isFixed=0;
    参数inputPortCount=4;//或任意数字。
    生成
    genvar m;
    
    对于(m=0;mYou的意思是什么?是的,像这样的东西我想能起作用。看起来这代码有点难看哈哈。我想我只是希望verilogOkay内置一些更优雅的东西,我想我已经纠正了。看起来不错吗?facepalm,好吧,现在我想我明白了。你的意思是什么?是的,像这样的东西doe我想这就是我的工作。看起来这代码有点难看。哈哈。我想我只是希望verilogOkay内置了更优雅的东西,我想我已经纠正了。看起来不错?facepalm,好吧,现在我想我已经找到了。那么如果你的设置同时包含int和float,会发生什么呢?为什么你需要所有这些代码,而你只需要在上实例化子模块的类型?在这种情况下,使用参数比使用文本宏更好。那么,如果同时设置int和float,会发生什么?当您只实例化一种子模块时,为什么需要所有这些代码?在这种情况下,使用参数比使用文本宏更好。