Verilog语法-005—宏定义
1、Verilog宏定义-`ifdef `ifndef
`ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下
语句/或者没有语句
`else //如果没有定义FOR_FPGA宏,执行如下语句
语句/或者没有语句
`endif //结束
`ifndef FOR_FPGA //如果没有定义了FOR_FPGA宏,则会执行如下
语句/或者没有语句
`else //如果定义了FOR_FPGA宏,执行如下语句
语句/或者没有语句
`endif //结束
`ifdef和`ifndef含义相反,并且`else都可以根据语句情况决定是否省略,`ifdef、`ifndef、和`else后面可以选择不加语句。注意:`endif不能省略,`endif限制了宏定义影响的范围。
最常见的三个宏定义是ASIC设计、仿真宏定义、FPAG宏定义。宏定义名称可以自己取,只要能够明确表达含义就行,例如 ASIC_DESIG、FOR_SIM,FOR_FPGA。
ASIC_DESIG:ASIC设计,就是投片需要的代码设计
FOR_SIM :为了便于VCS仿真
FOR_FPGA:便于FPGA实现,代码裁剪。
案例:`ifdef和`ifndef可以产生同样的效果
FPGA情况需要将代码进行裁剪,在FPGA情况下 client_num=4,在ASIC情况下,client_num=8。下面两种写法效果相同。
写法1:
reg [(8*client_num)-1:0] cfg_byte_num ;
always@(posedge clk or negedge rst_n)
...........................
10’h002: cfg_byte_num[31:0] <= mem_wr_dat ;
`ifndef FOR_FPGA
10’h003: cfg_byte_num[63:32] <= mem_wr_dat ;
`endif
................................
写法2:
reg [(8*client_num)-1:0] cfg_byte_num ;
always@(posedge clk or negedge rst_n)
...........................
`ifdef FOR_FPGA
10’h002: cfg_byte_num[31:0] <= mem_wr_dat ;
`else
10’h002: cfg_byte_num[31:0] <= mem_wr_dat ;
10’h003: cfg_byte_num[63:32] <= mem_wr_dat ;
`endif
................................