Verilog 可变模块安装
我正在做一个项目,如果可能的话,我想实现变量模块实例化。这是我的项目中的一个例子,我正在生成一组我设计的乘法器模块。要更改数据类型(即整型->浮点->定点),我需要更改正在调用的模块,有没有办法通过修改代码轻松做到这一点?我试过寻找答案,但似乎我没有找到答案 我不确定这有多重要,但我正在Vivado 2019.2中为Pynq-Z2编写代码 我的旧代码: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
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,会发生什么?当您只实例化一种子模块时,为什么需要所有这些代码?在这种情况下,使用参数比使用文本宏更好。