十进制和字符串文字的 Verilog 连接

Verilog concatenation of decimal and string literal

我想将小数点与字符串连接起来。喜欢:

parameter AWIDTH = 15;
...
...

wire [AWIDTH-1:0] addra_bus;
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"};

在 'cg_one' 的基础上,它会选择 {addra} 或 {AWIDTH, "'bz"}。在三元运算符的错误条件下,我将 AWIDTH 与 'bz.如果 cg_one 是 1'b0,我应该得到 15'bz 作为 addra_bus 中的值。有道理吗?

问题出在合成这段代码时。我收到警告:

WARNING: expression size 56 truncated to fit in target size 15 (VERI-1209)

为什么会这样? 56 码从哪里来?

您正在尝试默认将 32 位 AWIDTH 和 24 位 "'bz"(总共 56 位)保存为 15 位 addra_bus

您应该限制 AWIDTH 的宽度并增加 addra_bus 的宽度。例如:

parameter AWIDTH = 6'd30;

wire [AWIDTH-1:0] addra_bus;
assign addra_bus = cg_one ? {addra} : {AWIDTH, "'bz"};

您不应该使用字符串文字。您只需

assign addra_bus = cg_one ? addra : 'z;

'z 将扩展到 addra_bus

的宽度

正如 Dave 已经提到的将总线置于高状态,你可以这样做 assign addra_bus = cg_one ? addra : {AWIDTH{1'bz}}; 但是在驱动芯片级 IO 信号之前,不需要在可综合代码中将总线设置为 "z"。

如果要在总线中显示字符串15'bz 进行调试。

reg [7:0]  val = {"0"+AWIDTH%10};
reg [7:0]  val1 = {("0"+AWIDTH/10)};
assign addra_bus = cg_one ? {addra} : {val,val1};

[假设您的参数大小仅为 99。][因为每个字符需要 8 位,所以上面的代码只显示“15”]