Logic 条件:多位压缩阵列的逻辑状态

Logic 条件:多位压缩阵列的逻辑状态,logic,verilog,Logic,Verilog,下面的配置 reg [3:0] myreg; always@(...) begin ... if(myreg) begin <events> end ... end reg[3:0]myreg; 总是@(…)开始 ... 如果(myreg)开始结束。。。 结束 在不引用压缩数组中的特定位和位之间的逻辑操作的情况下,如何处理对“myreg”的引用 编辑:请您提供您所解释的行为记录在哪里?由于这种语义结构是允许的,我想应该有一些关于它的记录。。。谢谢大家! 编辑1:感谢您迄

下面的配置

reg [3:0] myreg;

always@(...) begin
...
    if(myreg) begin <events> end ...
end
reg[3:0]myreg;
总是@(…)开始
...
如果(myreg)开始结束。。。
结束
在不引用压缩数组中的特定位和位之间的逻辑操作的情况下,如何处理对“myreg”的引用

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

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

  • 为什么您认为(myreg)的逻辑值是减少还是减少(例如不减少)——是否有标准指南?让我们关掉常识和我们对“对”和“错”的感觉——这些不是我们在数学/控制论中得出结论的基础
  • “它可能在另一个模拟器中表现不同”——或者在现实生活中,这是真的吗? 这让我感到震惊,因为(a)我找不到说明它必须是一个缩减的文档,以及(b)Quartus(我使用的)没有对上述语法给出任何警告或错误
本VCS 2014.2解释了:

if (myreg) begin
  ...
作为myreg ie的一个或一个位缩减:

if ( |myreg == 1'b1) begin
  ...
正如Greg发现的,is第12.4节中的相关(SystemVerilog IEEE 1800-2012标准)章节

其计算结果为false(即,具有零值或值为x或z)

如果(myreg)提供的代码有效,但给定的x或z将计算为false,而不是传播x,如果使用未初始化的寄存器,您可能会发现RTL和门级模拟之间的差异,最初的x将评估为假,而不是可能为1并评估为真。

本VCS 2014.2解释:

if (myreg) begin
  ...
作为myreg ie的一个或一个位缩减:

if ( |myreg == 1'b1) begin
  ...
正如Greg发现的,is第12.4节中的相关(SystemVerilog IEEE 1800-2012标准)章节

其计算结果为false(即,具有零值或值为x或z)


如果(myreg)提供的代码有效,但给定的x或z将计算为false,而不是传播x,您可能会发现RTL和门级模拟之间的差异。如果使用未初始化的寄存器,初始x将计算为false,而不是可能为1,并计算为true。

是,@Morgan是正确的,当我合成以下代码时,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
模块aa(输入时钟,
输入rst\n,
输入[4:0]我的注册号,
输出寄存器chk
);
始终@(posedge clk或negedge rst_n)
开始
如果(!rst_n)开始

chk是的,@Morgan是正确的,当我合成以下代码时,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
模块aa(输入时钟,
输入rst\n,
输入[4:0]我的注册号,
输出寄存器chk
);
始终@(posedge clk或negedge rst_n)
开始
如果(!rst_n)开始

chkVerilog的行为应该如下:

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

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
if(myreg)
与§12.4条件if–else语句中的
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 条件_语句::=//来自A.6.6 [unique_priority]if(cond_谓词)语句_或_null {else if(cond_谓词)语句_或_null} [else语句\u或\u null] 唯一|优先级::=唯一|唯一0 |优先级 条件谓词::=表达式或条件模式{&&表达式或条件模式} 表达式或第二种模式::=表达式第二种模式 条件模式::=表达式匹配模式 语法12-2-if–else语句的语法(摘自附录A)

如果cond_谓词表达式的计算结果为true(即,具有非零的已知值),则应执行第一条语句。如果计算结果为false(即,值为零值或值为x或z),则不应执行第一条语句。如果存在else语句且cond_谓词表达式为false,则应执行else语句。因为if表达式的数值被测试为零,所以某些快捷方式是可能的。例如,下面两条语句 表达同样的逻辑:

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

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

if(myreg)
根据§12.4条件if–else语句,与
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 条件_语句::=//来自A.6.6 [unique_priority]if(cond_谓词)语句_或_null {else if(cond_谓词)语句_或_null} [else语句\u或\u null] 唯一|优先级::=唯一|唯一0 |优先级 条件谓词::=表达式或条件模式{&&表达式或条件模式} 表达式或第二种模式::=表达式第二种模式 条件模式::=表达式匹配模式 语法12-2-if–else语句的语法(摘自附录A)

如果cond_谓词表达式的计算结果为true(即,具有非零的已知值),则应执行第一条语句。如果计算结果为false(即,值为零值或值为x或z),则不应执行第一条语句。如果存在else语句且cond_谓词表达式为false,则应执行else语句。因为if表达式的数值