相关阅读
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");