Verilog系列:define的扩展用法(一)

前方曾经提高过预处理命令`define(Verilog系列:define和typedef)的基本用法,通过该命令可以对代码中使用该宏的地方进行文本替换,但是实际工作中经常会遇到一些特殊的情况,如果按照原来的方法已经不能处理了,例如对于一对双引号内的文本进行替换等,如下例.
【示例】期望将系统任务中双引号中的内容“v”也可以被替换
`timescale 1 ns / 1 ps
`define DISP(v) $display("The variable v = %h",v);
module top_tb;
int data;
initial begin
    data = 3;
    `DISP(data)
end
endmodule

【仿真结果】
# The variable v = 00000003
通过仿真结果可以看到,宏定义中的参数“v”并没有替换掉系统任务$display双引号中的“v”.可见采用传统的方式已经不能实现一些行为.SystemVerilog对Verilog中的`define进行了扩充以适应不同的更高的宏替换需求.在SystemVerilog中使用“`”对原有系统任务中字符串进行转换,使其中的字符串也成为宏替换检索的有效范围,如下例所示.

【示例】替换双引号内字符串中的宏定义
`timescale 1 ns / 1 ps
`define DISP(v) $display(`"The variable v = %h`",v);
module top_tb;
int data;
initial begin
    data = 3;
    `DISP(data)
end
endmodule

【仿真结果】
# The variable data = 00000003
从仿真结果中可以观测到,系统任务$display双引号中的“v”也被替换掉了,对比上例在宏定义时$display双引号前分别增加了一个“`”(这个符号在键盘的左上角,1键左侧),这样在进行宏替换时,原来双引号中的内容也会成为宏替换检索范围,其中内容也会作为被替换的部分,替换范围扩展如下图所示.
这里需要注意的是,如果使用`"可以使宏参数替换字符串中的内容,但是如果字符串中存在宏调用,那么字符串中的这个宏将不会被调用,后文将会示例说明.
虽然可以使用上述方法对字符串中的内容进行替换,但是有时候我们可能想进行稍微复杂一些的替换,如果仅仅采用上述的方法又不能满足要求,如下例.

【示例】
`timescale 1 ns / 1 ps
`define DISP(v) $display(`"The variable var_v = %h`",v);
module top_tb;
int data;
initial begin
    data = 3;
    `DISP(data)
end
endmodule
【仿真结果】
# The variable v_data = 00000003

通过仿真结果可以看到,“var_v”中的“v”并没有被替换掉,因为var_v被作为一个文本整体看待.如果想对其中的“v”进行替换,一种是在“var_v”中的“var_”和“v”之间插入一个空格,这样替换后字符串就会变作“var_ data”,即“var_”和“data”之间插入了一个空格,这与实际意图不负好.为了增加define宏定义的功能,SystemVerilog对宏的功能进行了提升改进,即可以实现这种文本中部分字符被替换的功能.

【示例】
`timescale 1 ns / 1 ps
`define DISP(v) $display(`"The variable var_``v = %h`",v);
module top_tb;
int data;
initial begin
    data = 3;
    `DISP(data)
end
endmodule
【仿真结果】
# The variable var_data = 00000003
示例中,在“var_”和“v”之间插入“``”后,“var_”后的“v”在被替换后不会再“var_”和被替换字符之间插入空格.注意这里的“``”中两个标号之间没有空格.利用SystemVerilog的这种字符串拼接替换的功能,在有些重复性设计中可以有效的减少重复性工作,避免不要的错误.如下例就是一种典型的应用.

【示例】
`timescale 1 ns / 1 ps
`define VAR_DEF(numb) logic var_``numb;
module top_tb;
`VAR_DEF(01)
`VAR_DEF(02)
`VAR_DEF(03)
`VAR_DEF(04)
`VAR_DEF(05)
`VAR_DEF(06)
`VAR_DEF(07)
`VAR_DEF(08)
`VAR_DEF(09)
endmodule
【仿真结果】

示例中通过宏VAR_DEF实现了多个具有相似结构信号的定义,简化了变量定义的冗杂过程.通过上两个示例,“``”在宏定义中的作用相当于分隔符,即将要被替换的宏变量从字符串中分隔出来.







全部评论
能接触新的知识也是一种成长
点赞 回复 分享
发布于 2022-09-14 16:12 河南

相关推荐

09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 75人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务