Verilog - 将多个定义连接成一个定义
Posted
技术标签:
【中文标题】Verilog - 将多个定义连接成一个定义【英文标题】:Verilog - Concatenate multiple defines into one define 【发布时间】:2017-01-27 21:59:54 【问题描述】:我正在寻找一种连接多个define statements into a single
define 语句的方法,以便我可以在case 语句中使用它。
例如,具有在头文件中定义的内存地址。我有一个 case 语句,根据地址决定是否应该将值写入 LUTRAM 或块 ram。
我有以下定义:
`define PWM_REPEAT_REG (6'h10) // Number of times to repeat a PWM Pulse
`define PWM_WIDTH_REG (6'h14) // Pulse width in timebase counts
`define PWM_PULSE_PERIOD (6'h1c) // PWM pulse period in timebase counts.
在我的代码中,我有一个看起来像这样的 case 语句:
case(sys_mgr_address)
`PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD : begin // Values for block RAM
ram_a_din <= sys_mgr_write_data;
ram_a_addr <= sys_mgr_address;
ram_a_wr_enable <= 1'b1;
sys_mgr_write_ok <= 1'b1;
update_available <= 1'b1;
end
endcase
实际的设计有几个地址,这种case语句会重复多次。我不想为每个定义一遍又一遍地输入所有定义,我想创建另一个看起来像这样的定义:
`define PWM_MODULE_BLOCK_RAM_ADDRESSES (`PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD)
case(sys_mgr_address)
PWM_MODULE_BLOCK_RAM_ADDRESSES : begin // Values for block RAM
ram_a_din <= sys_mgr_write_data;
ram_a_addr <= sys_mgr_address;
ram_a_wr_enable <= 1'b1;
sys_mgr_write_ok <= 1'b1;
update_available <= 1'b1;
end
endcase
^^ 上面的代码不起作用,因为它将数字连接成一个非常大的向量。我尝试了一些变体,比如没有连接大括号 ,将其定义为文本,一些不同的 `` 变体(但我不确定它到底是做什么的)。
有什么方法可以在编译前查看扩展的宏吗?现在,对于我尝试过的大多数错误,它只是给我一个错误,这并不能使故障排除变得容易。
谢谢!
【问题讨论】:
【参考方案1】:你想太多了。所有你需要做的就是把逗号的宏
`define PWM_MODULE_BLOCK_RAM_ADDRESSES `PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD
定义宏只是文本的简单扩展。
【讨论】:
我实际上首先尝试过,但在定义周围使用了括号,所以它是PWM_MODULE_BLOCK_RAM_ADDRESSES (
PWM_REPEAT_REG,PWM_WIDTH_REG,
PWM_PULSE_PERIOD)`。您没有括号的方法有效,为什么会这样?
因为括号不是 case 语句项的合法语法。宏必须扩展为合法的语法。
谢谢,一切都清楚了!现在完美运行。以上是关于Verilog - 将多个定义连接成一个定义的主要内容,如果未能解决你的问题,请参考以下文章