Macros 使用宏连接systemverilog中的信号名称
我正在尝试连接systemverilog/verilog中的两个字符串以创建一个信号名。 在我下面的代码片段中,lhs端似乎工作正常,但rhs端没有。 该工具给出一个错误“尚未声明bitemp” 如果我传递一个硬记录的值,比如说“0”到“clno”参数,那么它对lhs和rhs都有效Macros 使用宏连接systemverilog中的信号名称,macros,verilog,system-verilog,Macros,Verilog,System Verilog,我正在尝试连接systemverilog/verilog中的两个字符串以创建一个信号名。 在我下面的代码片段中,lhs端似乎工作正常,但rhs端没有。 该工具给出一个错误“尚未声明bitemp” 如果我传递一个硬记录的值,比如说“0”到“clno”参数,那么它对lhs和rhs都有效 enter code here `define strcat_assign_macro(lhs_prestr,lhs_poststr,rhs_prestr,rhs_poststr,clno) \ assign l
enter code here
`define strcat_assign_macro(lhs_prestr,lhs_poststr,rhs_prestr,rhs_poststr,clno) \
assign lhs_prestr``clno``lhs_poststr = rhs_prestr``clno``rhs_poststr;
module tempmod;
wire a0temp,b0temp;
wire a1temp,b1temp;
wire a2temp,b2temp;
assign b0temp =1'b1;
genvar i;
generate
for(i = 0; i < 3; i++)
begin
`strcat_assign_macro(a,temp,b,temp,i)
end
endgenerate
initial begin
$display (a0temp );
end
endmodule
在此处输入代码
`定义strcat\u assign\u宏(lhs\u prestr、lhs\u poststr、rhs\u prestr、rhs\u poststr、clno)\
分配lhs_prestr``clno``lhs_poststr=rhs_prestr``clno``rhs_poststr;
tempmod模块;
导线a0temp、b0temp;
导线a1temp、b1temp;
导线a2temp、b2temp;
指定b0temp=1'b1;
genvar i;
生成
对于(i=0;i<3;i++)
开始
`strcat\u分配\u宏(a、temp、b、temp、i)
结束
最终生成
初始开始
$display(a0temp);
结束
端模
在解析任何Verilog/SystemVerilog语法之前,宏将被展开。使用一个连接数组。由于“定义”在编译之前已展开,因此会出现这些错误
避免这种情况的一种方法是使用脚本自动定义用法,并在Verilog文件中使用相同的定义
下面是一个示例shell脚本,我是为此制作的。这是一个基本的脚本,但我认为足以让你了解这个想法
#!/bin/csh
set b='`'
set a=`egrep -n "^ *${b}strcat_assign_macro" $2 | cut -d: -f1`
set line=`egrep -n "${b}strcat_assign_macro" $2 | cut -d: -f2`
foreach i (`seq $1`)
set c=`expr $a + $i`
sed -i "${c}i${line}" temp.ip
sed -i "${c}s/^\(.*\), *[0-9]* *)/\1, ${i})/g" temp.ip
end
这是脚本之前和之后的文件
// Before
karan
shah
`strcat_assign_macro(b, temp, a, temp, 0)
maheshbhai
// ./temp.sh <Extra Define Lines> <FileName>
./temp.sh 2 input.v
// After
karan
shah
`strcat_assign_macro(b, temp, a, temp, 0)
`strcat_assign_macro(b, temp, a, temp, 1)
`strcat_assign_macro(b, temp, a, temp, 2)
maheshbhai
//之前
卡兰
沙阿
`strcat\u assign\u宏(b,temp,a,temp,0)
马赫什巴伊
///临时上海
/温度SH2输入电压
//之后
卡兰
沙阿
`strcat\u assign\u宏(b,temp,a,temp,0)
`strcat\u assign\u宏(b,temp,a,temp,1)
`strcat\u assign\u宏(b,temp,a,temp,2)
马赫什巴伊
感谢Dave的快速回复。不幸的是,“rhs”是一个DUT信号,它不是一个阵列。你知道我还有什么方法可以做到这一点吗?如果你需要使用本机语法,我想你会陷入困境。如果你愿意走vpp路线,你可以实现你想要的。现在很难找到链接(这是老东西),但在您的示例中,似乎有一个(某种程度上)维护版本的模块没有端口。所有“临时”都在模块内部。它在现实中看起来如何?此外,循环只有3次迭代。是这样吗?展开后,宏将如下所示:assign aitemp=bitemp代码>它将用temp
代替lhs_poststr和rhs_poststr,i、a和b将代替其他零件。所以,你需要一个不同的方案。