SystemVerilog:串联中的无基未大小文本

SystemVerilog:串联中的无基未大小文本,verilog,system-verilog,Verilog,System Verilog,我假设在串联的最左侧放置一个无基、无大小的文本时,只需用给定的值填充任何缺失的位。我没有在LRM中看到任何明确说明这一点的内容 logic [63:0] rd_data; logic [31:0] mem_dout; logic [15:0] op_data; .... assign rd_data = {'0, op_data, mem_dout}; 显然,以下行为是非法的: 编辑:正如@dave_59所指出的,这是合法的,只是不直观 assign rd_data = {op_data, m

我假设在串联的最左侧放置一个无基、无大小的文本时,只需用给定的值填充任何缺失的位。我没有在LRM中看到任何明确说明这一点的内容

logic [63:0] rd_data;
logic [31:0] mem_dout;
logic [15:0] op_data;
....
assign rd_data = {'0, op_data, mem_dout};
显然,以下行为是非法的:

编辑:正如@dave_59所指出的,这是合法的,只是不直观

assign rd_data = {op_data, mem_dout, '0};

只是想检查一下是否有人知道(1)这是按照预期进行模拟的,(2)主要的合成工具做了正确的事情,并将上面的16位绑定到0。

实际上,这两种说法都是合法的。在自定上下文中,
'0
相当于
1'b0
。串联的所有操作数在自定上下文中求值。两个串联的结果都是32+16+1=49位表达式。在rd_数据赋值的上下文中,这些表达式右对齐,然后左填充15个零


所以你得到了你期望的结果,但原因完全不同。

事实上,这两种说法都是合法的。在自定上下文中,
'0
相当于
1'b0
。串联的所有操作数在自定上下文中求值。两个串联的结果都是32+16+1=49位表达式。在rd_数据赋值的上下文中,这些表达式右对齐,然后左填充15个零


因此,您得到了预期的结果,但原因完全不同。

填充是基于提供的最高位的值,还是Verilog始终为0-pad?未签名数据始终为0-pad。有符号数据被符号扩展到有符号上下文的宽度。填充是基于提供的最高位的值还是Verilog始终为0-pad?无符号数据始终为0-pad。签名数据被符号扩展到签名上下文的宽度。