代码之家  ›  专栏  ›  技术社区  ›  artless-noise-bye-due2AI

逻辑和位not(!/~)之间的Verilog解析

  •  1
  • artless-noise-bye-due2AI  · 技术社区  · 5 月前

    我正在分配一个 wire 逻辑在寄存器和计数器之间。

    wire wire1;
    reg  signal;
    reg [5:0] count;
    
    assign wire1 = signal & !|count;   // line 1
    assign wire1 = signal & ! |count;  // line 2
    assign wire1 = signal & !(|count); // line 3
    assign wire1 = signal & ~|count;   // line 4
    

    Icarus给出了“第1行”和“第2行”的错误,但没有给出“第3行”和第4行的错误。 消息是,

    一元运算!不是主要表达式

    我认为这是一个解析器错误(两者都使用括号)。我正在使用 |count 作为 count==0 但发现减少更容易,因为许多工具会抱怨文本“0”的位长为32位。也就是说,我需要 count==COUNT_ZERO 其中它是正确长度的某个局部参数。

    “!”之间真的有区别吗对于一位构造,用“~”表示?

    2 回复  |  直到 5 月前
        1
  •  1
  •   toolic    5 月前

    正如你在问题的评论中提到的,这是你的两行之间的区别:

    • ~| :这两个字符组成一个 单一的 运算符,即还原OR
    • !| :这两个字符代表 运算符,即逻辑NOT和位OR

    几乎所有模拟器都已打开 EDA Playground 在此行上生成编译错误:

    assign wire1 = signal & !|count;  // line 1
    

    这意味着问题不仅限于Icarus Verilog( iverilog )模拟器。

    从编码风格的角度来看,我更喜欢为这个表达式创建一条新的线:

    wire counter_expired = |count;
    
        2
  •  1
  •   dave_59    5 月前

    Verilog/SystemVerilog具有多字符操作数,并具有BNF规则来防止此类误解。在这种情况下,它与操作数的宽度无关。使用括号或空格分隔运算符。