verilog报错:Illegal concatenation of an unsized constant. and 输入输出位宽不匹配
错误一:Illegal concatenation of an unsized constant.
concatenation with unsized literal; will interpret as 32 bits:
data_out_int = {{(CUT_INT_BITS){`DIN_SIGNED}},data_in_int} ;
修改为
data_out_int = {{(CUT_INT_BITS){1‘b1}},data_in_int} ;就正确了,就是要保障拼接时需要复制多少位时,需要确保{(CUT_INT_BITS){`DIN_SIGNED}}这个里面的两个量都是正确的值。
还有就是有的时候信号的位宽会根据输入进行调整:(也就是输入输出位宽不匹配时,位宽由参数导入)
parameter DATA_IN_WIDTH = 8;
parameter DATA_OUT_WIDTH = 9;
wire [DATA_IN_WIDTH -1:0] data_in;
wire [DATA_OUT_WIDTH -1:0] data_out ;
//因为参数的变化,可能会出现位宽不相符的情况
assign data_out = data_in;
//对于这种情况,有两个办法
//第一,是定义一个中间参数
parameter DATA_IN_WIDTH = 8;
parameter DATA_OUT_WIDTH = 9;
localparam DATA_OUT_WIDTH_REAL = (DATA_OUT_WIDTH > DATA_IN_WIDTH ) ? DATA_OUT_WIDTH : DATA_IN_WIDTH ;
wire [DATA_IN_WIDTH -1:0] data_in;
wire [DATA_OUT_WIDTH -1:0] data_out ;
wire [DATA_OUT_WIDTH_REAL -1:0] data_out_reg ;
assign data_out_reg = (DOUT_INT_BITS > DATA_W_IN_INT_BITS ) ? {{(CUT_INT_BITS){DIN_SIGNED}},data_in} : data_in;
assign data_out = data_out_reg[DATA_OUT_WIDTH -1:0] ;
//第二,采用generate产生代码块(注意,信号定义在generate之内时,只作用于这个代码块内部)
parameter DATA_IN_WIDTH = 8;
parameter DATA_OUT_WIDTH = 9;
wire [DATA_IN_WIDTH -1:0] data_in;
wire [DATA_OUT_WIDTH -1:0] data_out ;
generate
if (DOUT_INT_BITS > DATA_W_IN_INT_BITS)
assign data_out = {{(CUT_INT_BITS){DIN_SIGNED}},data_in};
else
assign data_out = data_in;
end
还有一种问题就是,定义的信号位宽报错
parameter DATA_IN_WIDTH = 8;
wire [DATA_IN_WIDTH -1:0] data_in;
//有可能DATA_IN_WIDTH是等于0的,这样就会发生data_in的序列有负数,从而产生问题
//所以可以定义一个中间变量
parameter DATA_IN_WIDTH = 8;
localparam DATA_IN_WIDTH_REAL = (DATA_IN_WIDTH == 0) ? 0 : DATA_IN_WIDTH -1;
wire [DATA_IN_WIDTH_REAL -1:0] data_in;