fscanf 用于 Verilog 中的长二进制字符串

问题描述 投票:0回答:3

我正在制作一个 Verilog 程序,需要从输入文件中读取 77 位二进制字符串行。输入文件将被格式化为由 77 个 1 和 0 后跟 ' '.

我的程序想要逐行读取这个并将整个字符串存储到一个如下所示的 reg 中:

reg DATA_REG [76:0]

我在用

fscanf(data_input_file, "???????", DATA_REG)

但我不确定在引号中放什么。我希望按字面解释字符串;也就是说,如果数字是...0000001110...我希望 DATA_REG 包含 0000001110,而不是 1110 或 14.

感谢您的帮助!

verilog scanf
3个回答
0
投票

您可以指定您正在阅读的数据的宽度如下:

status = $fsanf(data_input_file, "%**77**b", DATA_REG);

您需要确保输入文件中的数据具有相同的宽度。


0
投票

你有两个选择。如果要读取的总行数不是那么多,可以将整个文件读入内存

reg [76:0] memory[0:MAX_LINES];
integer index;
initial $readmemb("filename",memory);
always @index DATA_REG = memory[index];// or just use memory[index] directly

或者你可以做

status = $fscanf(data_input_file, "%b", DATA_REG);

-1
投票

你可以试试这个逻辑它会起作用。

模块 TB_example();注册 tb_clk; reg tb_reset; reg one_bit=0;

DW_file DUT_file(.clk (tb_clk), .reset(tb_reset), .one_bit(one_bit));

整数 fd=0;整数 i=0;整数计数=0; reg str=0;

初始开始 tb_clk=1'b0;永远 #20 tb_clk=~tb_clk;结束

初始开始 tb_reset<=1'b0;/// #2000; tb_reset<=1'b1; #2000; fd = $fopen("sample_1_bit_file.txt", "r"); $display("FILE DATA=%0d",fd); while (! $feof(fd)) begin @(posedge tb_clk) count<=count+1'b1; $fgets(str, fd); i=$fscanf(fd,"%b",str); one_bit=str; // bit stream of the variable $display("DATA------%0b", str); end $f close(fd); end endmodule

© www.soinside.com 2019 - 2024. All rights reserved.