Verilog - 将多个定义连接成一个定义

Posted

技术标签:

【中文标题】Verilog - 将多个定义连接成一个定义【英文标题】:Verilog - Concatenate multiple defines into one define 【发布时间】:2017-01-27 21:59:54 【问题描述】:

我正在寻找一种连接多个define statements into a singledefine 语句的方法,以便我可以在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 - 将多个定义连接成一个定义的主要内容,如果未能解决你的问题,请参考以下文章

verilog 中顶层模块实例引用多个模块时端口怎么连接

verilog 中顶层模块实例引用多个模块时端口怎么连接

如何将自己写的verilog模块封装成IP核

为啥在verilog中要定义wire?

verilog模块中需要调用memory型变量该怎么弄???急...

Verilog中parameter(参数)与define(宏定义)的区别