我编写了一个类似下面的代码用于连接,但它显示错误:
module main ;
bit [4:0] a;
reg b,c,d;
initial
begin
b = 0;
c = 1;
d = 1;
a = {b,c,0,0,d};
{b,c,d} = 3'b111;
$display(" a %b b %b c %b d %b ",a,b,c,d);
end
endmodule
此处错误显示constants cannot be concatenated
。
这里无法连接零和1。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
当前代码连接32位(或整数)宽度0。你真正想要的是:
a = {b, c, 1'b0, 1'b0, d};
注意:通过cadence工具我得到了:
file: main.sv
a = {b,c,0,0,d};
|
ncvlog: *E,NONOWD (main.sv,11|13): Illegal use of a constant without an explicit width specification [4.1.14(IEEE)].
a = {b,c,0,0,d};
|
ncvlog: *E,NONOWD (main.sv,11|15): Illegal use of a constant without an explicit width specification [4.1.14(IEEE)].
答案 1 :(得分:2)
请参阅11.4.12连接运算符中的IEEE 1800-2012 LRM
连接中不允许使用未定义的常数。这个 是因为需要连接中每个操作数的大小 计算连接的完整大小。
所以这是非法用法。您必须明确指定常数的位大小。
答案 2 :(得分:1)
由于错误说常量不能连接,所以在这里你试图连接非常的常量值。明确提及每个值的位大小将解决您的问题。以下是代码:
module concat;
bit [4:0] a;
reg b,c,d;
initial
begin
b=1'b0;
c=1'b1;
d=1'b1;
a={b,c,1'b0,1'b0,d};
{b,c,d}=3'b111;
$display("a: %b, b: %b, c: %b, d: %b",a,b,c,d);
end
endmodule