-1

如果 Verilog 中的 IF 语句在条件中具有无效值,则仅评估 else 分支。(在模拟中。)

例如下面的模块 SimpleIfStatement2b if a = 1'bx: b=0'b1

我在 Vegilog-2005 标准中搜索这种行为,但找不到它。

这种行为是标准的一部分还是仅在iverilog模拟器的实现中?这也是 VHDL/SystemVerilog/SystemC 的情况吗?描述这个的标准在哪里?

module SimpleIfStatement2b(input a,
        output reg b
    );

    always @(a) begin: assig_process_reg_d
        if (a) begin
            b <= 1'b0;
        end else begin
            b <= 1'b1;
        end
    end
endmodule


module main;
    reg a;
    wire b;

  SimpleIfStatement2b DUT (
    .a(a),
    .b(b)
  );

  initial begin
    a = 1'bx;
    repeat(1) #10;
    a = 1'b0;
    repeat(1) #10;
    a = 1'b1;
    repeat(1) #10;
    a = 1'b0;
    repeat(1) #10;
    a = 1'bx;
    repeat(1) #10;
    a = 1'b1;
    repeat(1) #10;
    a = 1'bx;
    repeat(10) #10;

  end

  initial begin
    repeat(10) #10;
    $finish;
  end

  initial
    $monitor("At %t, a=%b, b=%b,", $time, a, b, ); 
endmodule

http://tpcg.io/nAY75e

标准输出:

$iverilog -o main *.v
$vvp main
At                    0, a=x, b=x 
At                   10, a=0, b=1 
At                   20, a=1, b=0 
At                   30, a=0, b=1 
At                   40, a=x, b=1 
At                   50, a=1, b=0 
At                   60, a=x, b=1 
4

2 回答 2

2

IEEE 标准第 9.4 节,条件语句。第二段:

在此处输入图像描述

于 2018-02-25T17:24:21.593 回答
0

这是标准行为。

如果“if”条件被评估为False,那么它将继续运行“Else”部分。

可以这样想:

如果我告诉你:

“如果你超过 100 岁,高五!否则,进行一次星际跳跃。”

只有当你超过 100 岁时,我才会给你高五。否则(就像'Else'部分)我会告诉你做一个starjump。如果你已经超过 100 岁,你将不会进行星际跳跃,因为你已经通过了 'If' 条件,但如果你不超过 100 岁(即,'if' 条件为假),你将进行星际跳跃。

于 2018-02-25T17:18:49.037 回答