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

时间:2017-01-27 21:59:55

标签: concatenation verilog

我正在寻找一种连接多个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(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 个答案:

答案 0 :(得分:1)

你在想太难了。你需要做的就是把逗号作为宏

`define PWM_MODULE_BLOCK_RAM_ADDRESSES `PWM_REPEAT_REG, `PWM_WIDTH_REG, `PWM_PULSE_PERIOD 

定义宏只是简单的文本扩展。