对比两段代码的写法和Vivado生成的RTL电路图,可以加深对if结构写法的理解。
代码1:
module mux2_1_32_always(
input wire [31:0]a, input wire [31:0]b, input wire s, output reg [31:0]y );
always @(*)
if (s==0) y=a;
else if (s==1) y=b;
endmodule
图1-代码1在Vivado中得到的RTL电路
代码2:
module mux2_1_32_always(
input wire [31:0]a, input wire [31:0]b, input wire s, output reg [31:0]y );
always @(*)
if (s==0) y=a;
else y=b;
endmodule
图2-代码2在Vivado中得到的RTL电路
结果分析:
代码1与代码2均可以实现一个32位的2选1数据选择器。得到电路形式之所以不同,区别就在于设计源码的第6行,代码1的if结构,没有定义else语句块,因而导致了生成的电路输出端产生的latch模块。从这个例子可以看出,用分支结构来定义电路时,必须要写else语句块。这个要点也适用于case结构。