☰
Verilog基础:在if/else if/else语句嵌套时,最好使用begin块
2026/10/27 1:16:21 网站建设 项目流程

相关阅读

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");

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询