区分和扩展嵌套在定义宏中的文本宏
Distinguish and expand text macro nested in define macro
我想用文本宏定义一个参数MYTYPE
,其值由文本宏传递过来,例如
`define MY_FEATURE(nam,def) parameter nam=def;
然后是
`MY_FEATURE(MYTYPE, 1)
但该值被其他文本宏定义的值混合,例如
`MY_FEATURE(NEWTYPE, 2)
`MY_FEATURE(MYTYPE, NEWTYPE)
后一种情况将不起作用,除非 define MY_FEATURE
中的 def
加上指令点。
我需要区分这两种不同的情况并自动扩展宏 - 仅当它被定义时,所以我想出了这段代码但我得到了错误。
`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
我觉得你想多了。 `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);根据 manual. This means your MY_FEATURE
never creates new directives; it creates parameters. Directives and parameters are both treated as constants in simulation but act differently in compile. The `define
/parameters
relation in Verilog (and Verilog derived languages) is equivalent to C's #define
/const
关系。与 C 不同,要访问 `define
的值需要 `
前缀。
指令或参数均不能以数值开头。第一个字符必须是字母或下划线(又名 [a-zA-Z_]
)。 10
永远不能成为指令,甚至试图使用它也是非法语法。编译无法从非法语法指令名称中恢复。这是我建议传递 `yea
而不是 yea
.
的方式
如果有人为您构建了一个 nice 模型,那么它应该同样带有 nice 文档或某种获得支持的方式。
我想用文本宏定义一个参数MYTYPE
,其值由文本宏传递过来,例如
`define MY_FEATURE(nam,def) parameter nam=def;
然后是
`MY_FEATURE(MYTYPE, 1)
但该值被其他文本宏定义的值混合,例如
`MY_FEATURE(NEWTYPE, 2)
`MY_FEATURE(MYTYPE, NEWTYPE)
后一种情况将不起作用,除非 define MY_FEATURE
中的 def
加上指令点。
我需要区分这两种不同的情况并自动扩展宏 - 仅当它被定义时,所以我想出了这段代码但我得到了错误。
`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
我觉得你想多了。 `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);根据 manual. This means your MY_FEATURE
never creates new directives; it creates parameters. Directives and parameters are both treated as constants in simulation but act differently in compile. The `define
/parameters
relation in Verilog (and Verilog derived languages) is equivalent to C's #define
/const
关系。与 C 不同,要访问 `define
的值需要 `
前缀。
指令或参数均不能以数值开头。第一个字符必须是字母或下划线(又名 [a-zA-Z_]
)。 10
永远不能成为指令,甚至试图使用它也是非法语法。编译无法从非法语法指令名称中恢复。这是我建议传递 `yea
而不是 yea
.
如果有人为您构建了一个 nice 模型,那么它应该同样带有 nice 文档或某种获得支持的方式。