7.2 Verilog 文件操作 |-实例
最编程
2024-01-09 16:24:51
...
//(3) write string
reg [299:0] str_swrite, str_sformat;
reg [63:0] str_buf ;
integer len, age ;
initial begin
#20 ;
str_buf = "runoob!" ;
age = 9 ;
//$swrite 指定格式写包含变量的字符串
$swrite(str_swrite, "%s age is %d", str_buf, age) ;
$display("%s", str_swrite);
//$swrite 直接写不含有变量的字符串
$swrite(str_swrite, "years ", "old.") ;
$display("%s", str_swrite);
//$swrite 不指定格式写包含变量的字符串,不建议
$swrite(str_swrite, age) ;
$display("$swrite err test: %d", str_swrite);
$display();
//$sformat 指定格式写包含变量的字符串
$sformat(str_sformat, "I have learnt in %s", str_buf) ;
$display("%s", str_sformat);
//$sformat 直接写不含有变量的字符串,并获取字符串长度
len = $sformat(str_sformat, "for 4 years!") ;
$display("%s", str_sformat);
$display("$sformat len: %d", len);
//$sformat 直接一次写多个不含有变量的字符串,不建议
$sformat(str_sformat, "for", "4", "years!") ;
$display("$sformat err test: %s", str_sformat);
end
reg [299:0] str_swrite, str_sformat;
reg [63:0] str_buf ;
integer len, age ;
initial begin
#20 ;
str_buf = "runoob!" ;
age = 9 ;
//$swrite 指定格式写包含变量的字符串
$swrite(str_swrite, "%s age is %d", str_buf, age) ;
$display("%s", str_swrite);
//$swrite 直接写不含有变量的字符串
$swrite(str_swrite, "years ", "old.") ;
$display("%s", str_swrite);
//$swrite 不指定格式写包含变量的字符串,不建议
$swrite(str_swrite, age) ;
$display("$swrite err test: %d", str_swrite);
$display();
//$sformat 指定格式写包含变量的字符串
$sformat(str_sformat, "I have learnt in %s", str_buf) ;
$display("%s", str_sformat);
//$sformat 直接写不含有变量的字符串,并获取字符串长度
len = $sformat(str_sformat, "for 4 years!") ;
$display("%s", str_sformat);
$display("$sformat len: %d", len);
//$sformat 直接一次写多个不含有变量的字符串,不建议
$sformat(str_sformat, "for", "4", "years!") ;
$display("$sformat err test: %s", str_sformat);
end
忽略打印信息的空格,调试信息输出如下:
由此可知,$sformat 与 $swrite 用法可以一致,例如 $sformat 可采用指定格式的写字符串,或只写一次不含变量的字符串。此时 $sformat 相当于在第二个参数中未指定变量类型,所以第三个参数应该忽略不写。
$swrite 还可以一次写多个不包含变量的字符串,而 $sformat 不允许如此调用。
也建议,使用 $swrite 写包含变量的字符串时要指定变量类型,否则结果可能不可预测。
文件读取
系统任务 | 调用格式及说明 | |
---|---|---|
按字符读文件 | c = $fgetc( fd ) ; | |
按字符格式将 fd 数据输出给变量 c,c 位宽最少为 8 读取错误时 c 值为 EOF(-1),可以用 $ferror 检查错误类型 |
||
按字符写缓冲区 | code = $ungetc(c, fd ) ; | |
向文件 fd 缓冲区写字符 c c 值在下次调用 $fgetc 时返回,文件 fd 自身内容不会发生变化 正常写缓冲时返回值 code 为 0,发生错误时返回值 code 为 EOF |
||
按行读文件 | code = $fgets(str, fd) | |
按字符连续读,直至变量 str 被填满,或一行内容读取完毕,或文件结束 正常读取时返回值 code 为读取行数(次数),发生错误时 code 为 0 |
||
按格式读文件 | code = $fscanf(fd, format, args) ; | |
按格式 format 将文件 fd 中的数据读取到变量 args 中 format 可参考 $display 指定格式说明 读取一次的停止条件为空格或换行 读取发生错误时返回值 code 为 0 |
||
按格式读字符串 | code = $sscanf(str, format, args) ; | |
按格式 format 将字符串型变量 str 读取到变量 args 中 调用格式方法和 $fscanf 一致 |
||
按二进制读文件 | code = $fread(store, fd, start, count) ; | |
按二进制数据流格式将数据从文件 fd 读取到数组或寄存器变量 store 中 start 为文件起始地址,count 为读取长度 若 start/count 未指定,数据会全部填充至变量 store 中 若 store 为寄存器类型,则 start/count 参数无效,store 变量填充满一次数据后便会停止读取 |
c0dec0de 5555aaaa 12345678 aaaa5555 New data1: 80000003 New data2: 00000000 New data3: 00000000
$fgetc,$ungetc 调用举例
上一篇: 统一建模语言 (UML) 简介