Verilog基础:在if/else if/else语句嵌套时,最好使用begin块

相关阅读

Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        一般来说如果只有一条语句,是否使用begin块无关紧要,因为块语句的作用是将多条语句组织起来,如例1所示。

// 例1
always clk = !clk; // 只含有一条阻塞赋值语句  

initial #5 clk <= 1; // 只含有一条非阻塞赋值语句

initial // 只含有一条if语句
    if(clk == 1) $display("Yes"); // 只含有一条$display语句
    else $display("No");          // 只含有一条$display语句

initial
case (clk) // 只含有一条case语句
    2'b0: clk = 0;                // 只含有一条阻塞赋值语句
    2'b1: clk = clk + 1;          // 只含有一条阻塞赋值语句
endcase

initial // 只含有一条for语句
for (i = 0; i < N; i = i + 1)
    clk = clk + 1;                // 只含有一条阻塞赋值语句

         但是如果当if语句出现嵌套时,是否使用begin块会有所影响,这主要体现在if语句中有else if/else子句的情况,如例2所示。

// 例2
initial 
if(...) // if1
    if(...) $display("1"); // if2
else if $display("2"); 
else
    $display("3"); 

        在例2中,else if/else子句属于哪个if语句呢?如果你认为是if1,那你就被缩进欺骗了。事实上,Verilog就像C语言一样,缩进并不代表结构关系(这点与Python不同),而else if/else子句属于离它最近的if语句(前提是该if语句不是已完整的,即并没有配对的else子句),即if2。

        将例2重写为例3也许能更好理解。

// 例3
initial 
if(...) // if1
    if(...) $display("1"); // if2
    else if $display("2"); 
    else $display("3"); 

        如果想要让else if/else子句属于if1,则需要使用begin语句改变if语句作用的范围,如例4和例5所示。

// 例4
initial 
if(...) begin // if1
    if(...) $display("1"); // if2
end
else if $display("2"); 
else $display("3"); 
// 例5
initial 
if(...) begin // if1
    if(...) $display("1"); // if2
    else if $display("2"); 
end
else $display("3"); 

        在例4中,if2被begin块包围,因此表示该if语句已结束,因此else if/else子句都属于if1;在例5中, if2/else if子句被begin块包围,因此表示该if语句已结束,因此else子句属于if1。

        除了例4和例5,添加额外的空else子句也能达到相同的目的,如例6和例7所示,但该方法不建议,因为不太直观。

// 例6
initial 
if(...) // if1
    if(...) $display("1"); // if2
    else ;
else if $display("2"); 
else $display("3"); 
// 例7
initial 
if(...) // if1
    if(...) $display("1"); // if2
    else if $display("2"); 
    else ;
else $display("3"); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值