条件:多位打包数组

时间:2016-04-20 09:32:53

标签: logic verilog

以下配置

reg [3:0] myreg;

always@(...) begin
...
    if(myreg) begin <events> end ...
end

如何引用&#34; myreg&#34;在没有引用特定位的条件下,将处理打包数组中位之间的逻辑运算?

编辑:请您提供您解释的这种行为记录在哪里?由于允许这种语义结构,我想应该有一些关于它的文档......谢谢!

编辑1:感谢您到目前为止的所有答案。让我们重点关注以下两点:

  • 为什么你认为(myreg)的逻辑值是减少OR(例如不是AND) - 是否有标准指南?让我们关闭常识和我们对'#34;对'&#34;并且&#34;错误&#34; - 这些不是我们在数学/控制论中得出结论的问题。
  • 是否真的&#34;它可能与另一个模拟器的行为不同&#34; - 还是在现实生活中? 这让我感到震惊,因为(a)我找不到文件说明它必须是减少OR,以及(b)Quartus(我使用的)没有给出上述语法的任何警告或错误。

4 个答案:

答案 0 :(得分:0)

EDA Playground example VCS 2014.2解释:

if (myreg) begin
  ...

作为myreg的OR位减少,即:

if ( |myreg == 1'b1) begin
  ...

正如Greg发现LRM的相关(SystemVerilog IEEE 1800-2012标准)部分是第12.4节

  

它的计算结果为false(即,值为零或值为x或z),

提供的代码if (myreg)是有效的,但是如果使用未初始化的寄存器,则x或z将评估为假而不是传播x,您可能会发现RTL和门级仿真之间存在差异,初始x将评估为假,而不是潜在地为1,并评估为真。

答案 1 :(得分:0)

是的,@摩根是正确的Xillinx ISE和Questasim正在做同样的事情,当我合成以下代码时。

module aa( input clk,
           input rst_n,
           input [4:0] my_reg,
           output reg chk
         );

always @ (posedge clk or negedge rst_n)
begin
  if (!rst_n) begin
    chk <= 1'bz;
  end  else begin
    if (my_reg) begin
      chk <= 1'b1;
    end
    else begin
      chk <= 1'b0;
    end
  end
end

endmodule

你可以在这里看到原理图, enter image description here

答案 2 :(得分:0)

Verilog的行为应该是这样的:

myreg | result | comment
------|--------|--------
0000  | 1'b0   | FALSE - all bit bits are zero
0010  | 1'b1   | TRUE  - at least one bit is one
001X  | 1'b1   | TRUE  - at least one bit is one
000X  | 1'bX   | FALSE - we don't know whether all bits are zero or not
                         and if interprets 1'bX as FALSE

答案 3 :(得分:0)

根据{{​​3}}§12.4条件if-else语句

if(myreg)if(myreg != 0)相同

  

条件语句(或 if-else 语句)用于制作   关于是否执行声明的决定。形式上,语法   在语法12-2中给出。

conditional_statement ::=  // from A.6.6  
[ unique_priority ] if ( cond_predicate ) statement_or_null  
 { else if ( cond_predicate ) statement_or_null }  
 [ else statement_or_null ]  
unique_priority ::= unique | unique0 | priority  
cond_predicate ::= expression_or_cond_pattern { &&& expression_or_cond_pattern }  
expression_or_cond_pattern ::=  expression | cond_pattern 
cond_pattern ::= expression matches pattern
     

语法12-2- if-else语句的语法(摘自附录A)

  如果 cond_predicate 表达式求值为true(即具有非零已知值),则应执行第一个语句。如果计算结果为false(即,值为零或值为 x z ),则不应执行第一个语句。如果存在else语句且 cond_predicate 表达式为false,则应执行else语句。由于 if 表达式的数值被测试为零,因此可以使用某些快捷方式。例如,以下两个语句   表达同样的逻辑:

if(expression)  
if(expression != 0)

注意LRM正在检查表达式是否为非零值。它不限制宽度,甚至不考虑它是否为有符号类型。负数将是真的,只有零是假的。

合成器可以进行逐位压缩,与零相比,它是等效的逻辑。