Verilog和Verilog有什么区别!和~?

Verilog和Verilog有什么区别!和~?,verilog,boolean-logic,modelsim,Verilog,Boolean Logic,Modelsim,所以结果是让我坚持了几天的bug,是一段本应该计算为False,计算为True的代码。我最初的代码是这样的: if(~x && ~y) begin //do stuff end i、 如果x不是1,y不是1,那么做一些事情。通过调试程序,我意识到即使x为1,if语句中的表达式仍然会变成TRUE,并执行后续代码 但是,当我将声明更改为: if(x == 0 && y == 0) begin //do stuff end 并尝试: if(!x &&

所以结果是让我坚持了几天的bug,是一段本应该计算为False,计算为True的代码。我最初的代码是这样的:

if(~x && ~y) begin
    //do stuff
end
i、 如果x不是1,y不是1,那么做一些事情。通过调试程序,我意识到即使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

奇怪的是,“First case executed”被打印出来以确认我观察到的原始行为。

~
是一个位运算符,返回参数的倒数

是一个逻辑运算符,返回单个位

例如:

reg [7:0] bit_wise, logic_op;
initial begin
  bit_wise = ~8'hA1; // bit_wise == 8'h6E
  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语句中使用逻辑运算符。仅在数据赋值操作中使用位运算符。

我明白了。上述代码中的变量“x”是一个Verilog整数(
integer x;
)。但是,整数变量由Verilog表示为32位整数。所以,即使x是“1”,正如我所观察到的,~x的结果不是“0”,而是“11111111111111111111111110”!所以第一个案子被执行也就不足为奇了。是我的错。谢谢你的回答。

猜测,但按位求反不是类似于
~0xAA=0x55
,v.s.
!0xAA
相当于“0xAA不是零,所以求值为真”。@Marc B是的,这是一个重要的区别。但是在这种情况下,x和y都是1位长。如果x是“1”,我希望按位求反~x是“0”。一位长?真奇怪。您能否制作一个测试项目来显示
x
的值!x
~x
y
!y
~y
(~x&&y)
(!x&&y)
?仅供参考-
'1
语法不是有效的Verilog语法。这个结构是在SystemVerilog中引入的。由于不知道
x
y
的宽度,我决定使用SystemVeilog语法,并在注释中解释
'1
的用途。自IEEE标准1800-2009发布以来,Verilog和SystemVerilog是一个整体。(在摘要中提到过,也许其他人可以找到更好的引文。)if语句中的~用法不太清楚。我总是使用~进行比较。我的模拟器也不认为Verilog和SystemVerilog是一回事。在SystemVerilog之前,Verilog通常用于参考1995年或2001年的规范。与使用旧工具的用户相比,Verilog有很大的不同。很高兴您解决了这个问题。本课程将使用经典Verilog中的
reg
&
wire
类型,或现代Verilog中的
&
逻辑
类型,并适当调整信号大小。(请注意,这些类型并不等效)根据IEEE Std 1364,整数可实现为大于32位。IEEE标准1800(SystemVerilog)将宽度固定为32位。