Verilog语法中case语句是否只执行一条语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog语法中case语句是否只执行一条语句相关的知识,希望对你有一定的参考价值。

我猜你想问的是case (条件)
1:****
2:****
上面****是不是只能执行一条语句,是吗?
答案是,不是,可以执行很多语句。你用begin--end括起来就可以了。
参考技术A 默认是的。包括if else 也是一样。
但是可以利用begin end结构让其执行中间所有的语句。
不知道你是不是这个意思,欢迎追问~
参考技术B 是的,他和c语言不一样,c语言是只要这一条满足条件,下满的语句都会执行 参考技术C 补充2楼 貌似有多个条件成立时,执行最后一个

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

【中文标题】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语法中case语句是否只执行一条语句的主要内容,如果未能解决你的问题,请参考以下文章

FPGA学习----Verilog HDL语法

verilog中用if语句替换case D idea: one: two: three: end case

Verilog的If语句和Case语句

verilog里边的if语句形式,求大神解释下图片中的

verilog语句执行顺序的疑问?

Verilog学习笔记基本语法篇········ 结构说明语句