多分支if语句判断条件间存在包含关系的执行顺序

问题说明

在编写FPGA过程中会使用if...else if语句有时判断条件会存在包含关系,例如:

若输入为flag1和flag2同时为1,

则同时满足了执行a<=1和b<=1的条件,那么a,b会分别输出什么呢?

仿真探究

按照上文的代码进行仿真,先令flag1为1,flag2为0,再复位令flag1和flag2同时为0。即:先满足包含关系的母条件,然后再仅满足子条件。仿真结果如下:

根据波形图可以看到,无论是仅满足子条件还是满足母条件,最终只有母条件的分支被执行。

可以得出结论:

  1. 同时满足两个条件时,if...else语句也只会执行一个分支;
  2. 同时满足具有包含关系的两个条件时,只会执行靠前的分支。

为了验证结论2是否正确,将子母条件分支交换次序,其他代码不变,再次仿真,部分代码和仿真结果如下:

结论:

  1. 条件分支语句中,满足更靠前的条件先执行对应分支命令,不再判断后续条件;
  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值