如何参数化verilog属性(* *)?

How to parameterize verilog attribute (* *)?

如何根据模块参数声明具有 verilog 属性的信号?

我试过了:

if (KEEP_VERILOG) begin
  (*keep="true"*)reg mysig;
end else begin
  reg mysig;
end

// doing something with mysig

我得到一个合成错误:mysig is not declared

您不能从该块外部引用未命名的 begin/end 块中声明的信号。为块命名(并且您必须为两个块指定相同的名称以用于您想要执行的操作)并在参考中使用该名称。

if (KEEP_VERILOG) begin : blockname
    (*keep="true"*)reg mysig;
end else begin : blockname
  reg mysig;
end

// do something with blockname.mysig

属性规范允许使用常量表达式。因此你可以直接在属性中使用模块参数:

(*keep=KEEP_VERILOG*) reg mysig;

属性的值将具有参数的值。