问题说明
在编写FPGA过程中会使用if...else if语句有时判断条件会存在包含关系,例如:
若输入为flag1和flag2同时为1,
则同时满足了执行a<=1和b<=1的条件,那么a,b会分别输出什么呢?
仿真探究
按照上文的代码进行仿真,先令flag1为1,flag2为0,再复位令flag1和flag2同时为0。即:先满足包含关系的母条件,然后再仅满足子条件。仿真结果如下:
根据波形图可以看到,无论是仅满足子条件还是满足母条件,最终只有母条件的分支被执行。
可以得出结论:
- 同时满足两个条件时,if...else语句也只会执行一个分支;
- 同时满足具有包含关系的两个条件时,只会执行靠前的分支。
为了验证结论2是否正确,将子母条件分支交换次序,其他代码不变,再次仿真,部分代码和仿真结果如下:
结论:
- 条件分支语句中,满足更靠前的条件先执行对应分支命令,不再判断后续条件;
- 在对具有包含关系的条件分支代码编写时,应将满足条件的子集写在母集的后面,以保证代码按照预期运行。需要注意的是,即使将二者顺序写反,编译环境也不会报错,但最终并不会按照预期的设定运行。
module test(
input sys_clk ,
input sys_rst_n ,
input flag1 ,
input flag2
);
reg a ;
reg b ;
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
a <= 1'b0 ;
b <= 1'b0 ;
end
else if (flag1 == 1'b1 && flag2 == 1'b1)
b <= 1'b1 ;
else if (flag1 == 1'b1)
a <= 1'b1 ;
else;
end
endmodule
// 上面是代码本体 下边是仿真激励文件
`timescale 1ns/1ns
module tb_test();
parameter CLK_PERIOD = 20;
reg sys_clk;
reg sys_rst_n;
reg flag1 ;
reg flag2 ;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
flag1 = 1'b0;
flag2 = 1'b0;
#5
sys_rst_n = 1'b1;
flag1 = 1'b1;
#10
sys_rst_n = 1'b0;
#5
sys_rst_n = 1'b1;
flag1 = 1'b1;
flag2 = 1'b1;
end
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
test u_test(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n),
.flag1 (flag1 ),
.flag2 (flag2 )
);
endmodule