【问题标题】:How use value of string read from file如何使用从文件中读取的字符串值
【发布时间】:2021-10-08 17:04:31
【问题描述】:

我声明我是 verilog 的新手。

我正在尝试制作一个测试平台来测试设计。

在文件中,我为每一行设置了一组 值。

文件中的值如下所示:

| 128'h2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A | 64'h2A2A2A2A2A2A2A2A | 64'hC30D63F15BA8B687 |

到目前为止我所做的(可能是错误的)是打开文件并像字符串一样读取它:

while (! $ feof (outfile0)) begin // read until an "end of file" is reached.
   @ (posedge clk);
   $ fgets (A, outfile0);
   ctxt = A[184:16];
   key= A[688:392];

我想要完成的是任务

key = 128'h2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A

如果我这样做了

key = A [688: 392];

我无法通过打印密钥获得期望值

我认为问题在于我为键分配了一个字符串,而不是从文件中读取的十六进制值,但是我不知道如何解决这个问题。

谢谢大家!

编辑 - 示例代码:

reg  [63:0] ctxt;
reg  [127:0] key;
wire [63:0] ptxt;

integer outfile0;
reg [728:0] A;

begin: READ_FILE
        outfile0=$fopen("test.txt","r");
        while (! $feof(outfile0)) begin
                    @(posedge clk);
                    $fgets(A, outfile0);
                    #10;
                    ctxt = A[184:16];
                    key=A[688:392];
        end
        $fclose(outfile0);

结束

Test.txt 示例:

| 128'h00000000000000000000000000000000 | 64'h0000000000000008 | 64'h2FFCE6557D7DC86C |
| 128'h00000000000000000000000000000000 | 64'h0000000000000008 | 64'h2FFCE6557D7DC86C |
| 128'h00000000000000000000000000000000 | 64'h0000000000000008 | 64'h2FFCE6557D7DC86C |
.
.
.
etc

【问题讨论】:

  • 我添加了一个代码 sn-p(希望够了)。问题是,如果我打印密钥的十六进制,我没有从文件中读取相同的值,而是字符串的十六进制。

标签: verilog


【解决方案1】:

使用$fscanf 代替$fgets 读取格式化数据。格式化数据不理解 SystemVerilog 数字语法,因此您可以将其删除,或确保在您的格式字符串中被跳过

code = $fscanf(outfile0, "| 128'h%h | 64'h%h | 64'h%h |", key, ctxt, ptxt);

【讨论】:

  • 谢谢!这正是我想要做的。不知道fscanf可以这样解决问题
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多