systemverilog中常量的连接

时间:2013-07-30 06:28:26

标签: concatenation system-verilog

我编写了一个类似下面的代码用于连接,但它显示错误:

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。任何人都可以帮我解决这个问题吗?

3 个答案:

答案 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