Macros 使用宏连接systemverilog中的信号名称

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

我正在尝试连接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 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将代替其他零件。所以,你需要一个不同的方案。