0

我想MYTYPE使用文本宏定义一个参数,其值由文本宏传递,例如

`define MY_FEATURE(nam,def) parameter nam=def;

接着

`MY_FEATURE(MYTYPE, 1)

但是值是由其他文本宏定义的那些混合的,例如

`MY_FEATURE(NEWTYPE, 2)
`MY_FEATURE(MYTYPE, NEWTYPE)

def除非在indefine MY_FEATURE中添加指令点,否则后一种情况将不起作用。

我需要区分这两种不同的情况并自动扩展宏 - 只有当它被定义时,所以我想出了这段代码,但我得到了错误。

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) `ifdef def parameter nam=`def; `else parameter nam=2; `endif

module test;

  `MY_FEATURE(MYTYPE,yea)
  initial begin
    $display("%d",MYTYPE);
  end
endmodule

上面的代码有效并给出了一个1作为输出。但是,如果我写

`MY_FEATURE(MYTYPE,10)

因为对于其他情况,我需要为参数分配一个实际数字,那么我会得到

 `ifdef without a macro name - ignored.

我想要的结果被MYTYPE分配为 10。有什么办法可以做到这一点?谢谢。

代码可以在这里找到 http://www.edaplayground.com/x/6Jha

4

1 回答 1

1

我觉得你想多了。`define创建一个指令表达式。当您将指令作为参数传递给另一个指令时,您可以将其传递为`yea.

这是一个例子:

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) parameter nam=def;

module test;
  `MY_FEATURE(MYTYPE,`yea)
  `MY_FEATURE(MYTYPE2,10)
  `MY_FEATURE(MYTYPE3,MYTYPE+MYTYPE2)
  initial begin
    $display("%d %d %d",MYTYPE, MYTYPE2, MYTYPE3); // displays: 1 10 11
  end
endmodule

http://www.edaplayground.com/x/5Pgf


Verilog-AMS(Verilog-A 的超集)是它自己的语言,源自 Verilog(IEEE 标准 1364);根据手册。这意味着您MY_FEATURE永远不会创建新指令;它创建参数。指令和参数在模拟中都被视为常量,但在编译中表现不同。Verilog(和 Verilog 派生语言)中的`define/关系parameters等价于C 的#define/const关系。与 C 不同,访问 a 的值`define需要`前缀。

指令或参数都不能以数值开头。第一个字符必须是字母或下划线(aka [a-zA-Z_])。永远不可能有10指令,甚至试图使用它都是非法的语法。编译无法从非法语法指令名称中恢复。这是我建议通过`yea而不是yea.

如果有人为您构建了一个不错的模型,那么它应该带有同样出色的文档或某种获得支持的方式。

于 2016-05-04T20:58:00.580 回答