以下配置
reg [3:0] myreg;
always@(...) begin
...
if(myreg) begin <events> end ...
end
如何引用&#34; myreg&#34;在没有引用特定位的条件下,将处理打包数组中位之间的逻辑运算?
编辑:请您提供您解释的这种行为记录在哪里?由于允许这种语义结构,我想应该有一些关于它的文档......谢谢!
编辑1:感谢您到目前为止的所有答案。让我们重点关注以下两点:
答案 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
答案 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)
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正在检查表达式是否为非零值。它不限制宽度,甚至不考虑它是否为有符号类型。负数将是真的,只有零是假的。
合成器可以进行逐位压缩,与零相比,它是等效的逻辑。