18

所以最终让我坚持了好几天的错误是一段应该评估为 False 评估为 True 的代码。我的初始代码类似于:

if(~x && ~y) begin
    //do stuff
end

即如果 x 不是 ONE 并且 y 不是 ONE 则做一些事情。单步调试调试器,我意识到即使 x 为 1,if 语句中的表达式仍然为 TRUE,并且执行了后续代码。

但是,当我将声明更改为:

if(x == 0 && y == 0) begin
//do stuff
end

并尝试过:

if(!x && !y) begin
//do stuff
end 

未评估 if 语句中的代码,这是预期的行为。我知道 ~ 是按位否定和 ! 逻辑否定,但 (~x && ~y) 和 (!x && !y) 不应该评估为同一件事吗?恐怕代码库太大,所以我不能在这里粘贴,但这是我为使代码按预期工作所做的唯一更改。谢谢。


作为回应,针对以下评论之一,我创建了一个测试用例来测试这种行为:

`timescale 10ns/1ns

module test_negation();
        integer x, y;

    initial begin
        x = 1; y = 0;

        if(~x && ~y) begin
            $display("%s", "First case executed");
        end

        if(!x && !y) begin
            $display("%s", "Second case executed");
        end

        if(x == 0 && y == 0) begin
            $display("%s", "Third case executed");
        end
    end endmodule

奇怪的是,打印了“第一个案例执行”以确认我观察到的原始行为。

4

2 回答 2

9

我懂了。上述代码中的变量“x”是一个 Verilog 整数 ( integer x;)。但是,整数变量由 Verilog 表示为 32 位整数。所以即使 x 是“1”,正如我所观察到的,~x 不会导致“0”,而是“11111111111111111111111111111110”!所以第一案被执行也就不足为奇了。我的错。感谢所有的答案。

于 2013-05-07T18:02:01.040 回答
8

~是按位运算符并返回参数的反转。

!是一个逻辑运算符并返回一个位。

例子:

reg [7:0] bit_wise, logic_op;
initial begin
  bit_wise = ~8'hA1; // bit_wise == 8'h5E
  logic_op = !8'hA1; // logic_op == 8'b00
  $display("bit_wise:%h logic_op:%h", bit_wise, logic_op); // bit_wise:5e logic_op:00
end

对于您的示例:

if(~x && ~y) begin
    //do stuff
end

实际上与以下内容相同:

if(x!='1 && y!='1) begin // '1 means the with of x all 1s and the with of y all 1s
    //do stuff
end

一般来说,最好的编码风格是在 if 语句中使用逻辑运算符。仅对数据赋值操作使用按位运算符。

于 2013-05-07T17:50:46.830 回答