【发布时间】:2022-01-23 03:26:02
【问题描述】:
我想显示前 5 个字符,但在我的代码中它从末尾开始显示:
module TEST_gate;
reg[8*5:1]str1;
initial begin
str1="HelloWorld";
$display("str1= %s",str1);
我想显示Hello,但它显示World。
【问题讨论】:
我想显示前 5 个字符,但在我的代码中它从末尾开始显示:
module TEST_gate;
reg[8*5:1]str1;
initial begin
str1="HelloWorld";
$display("str1= %s",str1);
我想显示Hello,但它显示World。
【问题讨论】:
您的reg 不够宽,无法容纳字符串的所有 10 个字符。要存储所有字符,请更改:
reg[8*5:1]str1;
到:
reg[8*10:1]str1;
请参阅 IEEE Std 1800-2017,第 5.9 节 字符串文字。
字符串字面量可以分配给整数类型,例如打包的 大批。如果大小不同,它是正确的。完全存储一个 字符串字面量,整数类型应该用宽度声明 等于字符串中的字符数乘以 8。
那么你需要根据你的显示的前5个字符选择一个范围。
如果您在模拟器中启用 SystemVerilog 功能,则可以改用 string 数据类型:
module tb;
reg[8*10:1]str1;
string str2;
initial begin
str1="HelloWorld";
str2="HelloWorld";
$display("str1= %s",str1);
$display("str1= %s",str1[80:41]);
$display("str2= %s",str2);
$display("str2= %s",str2.substr(0,4));
end
endmodule
打印:
str1= HelloWorld
str1= Hello
str2= HelloWorld
str2= Hello
请参阅第 6.16.8 节 Substr()。
【讨论】:
在 Verilog 中,字符串文字只是压缩的位数组(或位向量),每个字符是 8 个 ASCII 位。字符串中第一个字符的最左边位是向量的 MSB,最后一个字符的最右边位是向量的 LSB。
您的“HelloWorld”字符串文字是 10 个字符,用于抑制 80 位压缩数组,您正试图将其分配给 40 位变量。对于从较大的整数变量到较小的整数变量的任何赋值,Verilog 右对齐并静默截断左侧的位,在您的情况下是表示“Hello”的位。
【讨论】: