【问题标题】:How to Display String on Verilog如何在 Verilog 上显示字符串
【发布时间】: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

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您的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()

    【讨论】:

      【解决方案2】:

      在 Verilog 中,字符串文字只是压缩的位数组(或位向量),每个字符是 8 个 ASCII 位。字符串中第一个字符的最左边位是向量的 MSB,最后一个字符的最右边位是向量的 LSB。

      您的“HelloWorld”字符串文字是 10 个字符,用于抑制 80 位压缩数组,您正试图将其分配给 40 位变量。对于从较大的整数变量到较小的整数变量的任何赋值,Verilog 右对齐并静默截断左侧的位,在您的情况下是表示“Hello”的位。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 2016-03-03
        • 1970-01-01
        相关资源
        最近更新 更多