systemverilog/verilog文件操作

1、Verilog文件操作

        Verilog具有系统任务和功能,可以打开文件、将值输出到文件、从文件中读取值并加载到其他变量和关闭文件。

1.1 、Verilog文件操作

1.1.1、打开和关闭文件

module tb;
// 声明一个变量存储 file handler
integer fd;
initial begin
// 以写权限打开一个文件名为 "my_file.txt" 的新文件,并将文件柄指针存储在变量"fd"中fd = $fopen("my_file.txt", "w");
// 关闭指向 "fd"的文件柄$fclose(fd);
end
endmodule

文件操作选项:

1.1.2、写文件

        每个系统函数都以基数十进制打印值。它们还有其他三个版本,可以以二进制、八进制和十六进制打印。

integer handle1;
initial begin
handel1=$fopen("picture_out.txt","w");
forever @(posedge clk) beginif(PicInHEnd &PicInVEnd) begin$fclose(handle1);$finish;end
end
end
always@(posedge clk) beginif(  PicOutVld  ) beginif(PicInHEnd)$fwrite(handle1,"%h",PicInData,"\n");else$fwrite(handle1,"%h",PicInData,"\n");end
end

使用方法如下:
 

module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin// Create a new filefd = $fopen("my_file.txt", "w");my_var = 0;$fdisplay(fd, "Value displayed with $fdisplay");#10 my_var = 8'h1A;$fdisplay(fd, my_var); // Displays in decimal$fdisplayb(fd, my_var); // Displays in binary$fdisplayo(fd, my_var); // Displays in octal$fdisplayh(fd, my_var); // Displays in hex// $fwrite does not print the newline char '' automatically at// the end of each line; So we can predict all the values printed// below to appear on the same line$fdisplay(fd, "Value displayed with $fwrite");#10 my_var = 8'h2B;$fwrite(fd, my_var);$fwriteb(fd, my_var);$fwriteo(fd, my_var);$fwriteh(fd, my_var);// Jump to new line with '', and print with strobe which takes// the final value of the variable after non-blocking assignments// are done$fdisplay(fd, "Value displayed with $fstrobe");#10 my_var <= 8'h3C;$fstrobe(fd, my_var);$fstrobeb(fd, my_var);$fstrobeo(fd, my_var);$fstrobeh(fd, my_var);#10 $fdisplay(fd, "Value displayed with $fmonitor");$fmonitor(fd, my_var);for(i = 0; i < 5; i= i+1) begin#5 my_var <= i;end#10 $fclose(fd);
end
endmodule

1.1.3、读取文件

1.1.3.1、文件读取:$fscanf和$readmemh

其中$readmemh的作用是一次性将文件中的数据读取到某个数组中,然后一次从数组中读取1个数组进行处理,而$fscanf的作用是从文件中读取一行数据。

        在verilog中,$fscanf函数用于从文件中读取格式化的数据,他的语法如下:

$fscanf(file ,format ,variable);

其中:
file:表示一个整数变量,表示要读取的文件句柄
format:是一个字符串,指定读取数据的格
variable:是一个变量,用于存储从文件中读取的数据
$fscanf函数将根据指定的文件中读取数据,并将其存储在变下是一些常见的格式说明符
%h:十六进制表示的整数
%d:十进制表示的整数
%b:二进制表示的整数
%f:浮点数。
以下演示如何使用$ fscanf函数从文件中读取十六进制
 

module file_reader;reg [7:0] data;reg clk;integer file;initial begin// 打开文件file = $fopen("input.txt", "r");   if (file == 0) begin$display("无法打开文件");$finish;end// 模拟时钟clk = 0;forever #5 clk = ~clk;endalways @(posedge clk) begin// 读取文件中的数据if (!$feof(file)) begin$fscanf(file, "%h", data);$display("读取数据:%h", data);endelse begin$display("文件读取完毕");$fclose(file);$finish;endendendmodule

        在此例中, Verilog模块 file reader使用$ fopen函数打开名为" input tx'的文件,并按照每个时钟周期读取文件的数据。使用 sfscanf函数从文件中读取十六进制数,并使用 display函数打印读取到的数据。每当读取到一个数据时,它将使用 Display函数打印出来。当文件读取完毕时,它将关闭文件并结束仿真。请确保在使用此代码之前,将文件" input. txt"放在与 Verilog源代码相同的目录中,并在文件中包含要读取的数据。

1.1.3.2、读取文件
在 Verilog 中,$readmemh 是一个系统任务,用于从文件中读取十六进制数据并将其加载到内存中。它的语法如下:$readmemh(filename, memory);
其中:filename 是一个字符串,表示要读取的文件名。
memory 是一个内存数组或寄存器数组,用于存储从文件中读取的数据。
$readmemh 任务会打开指定的文件,并按行读取文件中的十六进制数据。它会将数据加载到 memory 数组中,每行数据对应数组的一个元素。以下是一个示例,演示如何使用 $readmemh 任务从文件中读取十六进制数据:module file_reader;reg [7:0] memory [0:9]; // 定义一个包含10个元素的内存数组initial begin$readmemh("input.txt", memory); // 从文件中读取数据并加载到内存数组中// 打印内存数组中的数据for (integer i = 0; i < 10; i = i + 1) begin$display("memory[%0d] = %h", i, memory[i]);end$finish;endendmodule

在此示例中,我们通过$ readmemh任务从文件"input"中读取数据,并将其加载到内存数组 memory中。然后,我们使用循环打印出 memory数组中的数据。" input. txt"需要放在与 Verilog源代码相同的目录中,并在文件中包含要读取的十六进制数据(每行一个)

3.1.1.3、

        使用 Verilog的fget函数输入文件读取功能,逐行读取文件内容并将其存储在寄存器或内存。

3.1.1.4、读取一行:

        系统函数$ fgets从fd指定的文件中将字符读入变量str直到st被填满,或者读取换行符并传输到st,或者遇到EOF条件。如果在读取过程中发生错误,则返回代码零。否则返回读取的字符数。以下是—个示例代码,演示如何逐行读取文件并将其存储在寄存器。

module file_reader;reg [7:0] data [0:9]; // 定义一个包含10个元素的寄存器数组reg [7:0] temp;integer file;integer line_num;initial begin// 打开文件file = $fopen("input.txt", "r");if (file == 0) begin$display("无法打开文件");$finish;endline_num = 0;// 逐行读取文件while (!$feof(file)) begin$fgets(temp, file);data[line_num] = temp; // 将读取到的数据存储在寄存器中line_num = line_num + 1;end$fclose(file);// 打印寄存器中的数据for (integer i = 0; i < 10; i = i + 1) begin$display("data[%0d] = %h", i, data[i]);end$finish;end
endmodule

        在此示例中,我们定义了一个包含10个元素的寄存器数组data,用于存储从文件中读取的每一行数据。使用$ fgets函数逐行读取文件,并将读取到的数据存储在temp变量中。然后,将temp的值存储在data数组的相应索引位置上。最后,我们使用循环打印出data数组中的数据请确保在使用此代码之前,将文件"inpυt.txt"放在与 Verilog源代码相同的目录中,并在文件中包含要读取的数据。

1.1.3.1、检测EOF

        当找到EOF时,系统函数$feof返回一个非零值,否则对于给定的文件描述符作为参数返回零。

module tb;
reg[8*45:1] str;
integer fd;
initial beginfd = $fopen("my_file.txt", "r");// Keep reading lines until EOF is foundwhile (! $feof(fd)) begin// Get current line into the variable 'str'$fgets(str, fd);// Display contents of the variable$display("%0s", str);end$fclose(fd);
end
endmodule
1.1.3.2 、display的多个参数

        当给$display多个变量是按给定的顺序一个接一个地打印所有变量,没有空格。

module tb;reg [3:0] a, b, c, d;reg [8*30:0] str;integer fd;initial begina = 4'ha;b = 4'hb;c = 4'hc;d = 4'hd;fd = $fopen("my_file.txt", "w");$fdisplay(fd, a, b, c, d);$fclose(fd);end
endmodule

1.1.4将数据格式化为字符串

        系统函数中的第一个参数$sformat是放置结果的变量名。第二个参数是 Eformat string,它告诉如何将以下参数格式化为字符串。

module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Format 'a' and 'b' into a string given
// by the format, and store into 'str' variable
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule

2、systemverilog文件操作

2.1.1、打开关闭文件

        $fopen系统函数打开文件进行读取或者写入,该任务将返回一个成为文件描述符的32位整数句柄,这个句柄应该用于读取和写入该文件,
直到它被关闭。
        $fclose系统任务用于关闭文件,一旦文件描述符关闭,就不允许进一步读取或写入文件描述符。
        例如:在下面的代码中,声明一个名为fd的int变量来保存文件描述符。fd最初为零,并从$fopen()中获取有效值,可以检查文件是否成功打开,该文件最终在执行$fclose()时关闭。
 

module tb;initial begin// 1. Declare an integer variable to hold the file descriptorint fd;// 2. Open a file called "note.txt" in the current folder with a "read permission// If the file does not exist, then fd will be zerofd = $fopen ("./note.txt", "r");if (fd) $display("File was opened successfully : %0d", fd);else $display("File was NOT opened successfully : %0d", fd);// 2. Open a file called "note.txt" in the current folder with a "write permission// "fd" now points to the same file, but in write modefd = $fopen ("./note.txt", "w");if (fd) $display("File was opened successfully : %0d", fd);else $display("File was NOT opened successfully : %0d", fd);// 3. Close the file descriptor$fclose(fd);end
endmodule

1.1.2、以读取和附加模式打开

        默认情况下,文件以写入w模式打开。通过提正确的模式类型,也可以在其他模式下打开文件。下表显示可以打开文件的所有不同模式例子:在下面的代码中,我们将看到如何使用上表中描述的不同文件访问模式。

module tb;initial beginint fd_w, fd_r, fd_a, fd_wp, fd_rp, fd_ap;fd_w = $fopen ("./todo.txt", "w"); // Open a new file in write mode afd_r = $fopen ("./todo.txt", "r"); // Open in read modefd_a = $fopen ("./todo.txt", "a"); // Open in append modeif (fd_w) $display("File was opened successfully : %0d", fd_w);else $display("File was NOT opened successfully : %0d", fd_w)if (fd_r) $display("File was opened successfully : %0d", fd_r);else $display("File was NOT opened successfully : %0d", fd_r)if (fd_a) $display("File was opened successfully : %0d", fd_a);else $display("File was NOT opened successfully : %0d", fd_a)// Close the file descriptor$fclose(fd_w);$fclose(fd_r);$fclose(fd_a);end
endmodule

2.1.3、读取和写入文件

        文件应以写入w模式或附加a模式打开。系统任务如 $fdisplay和 $fwrite0可用于将格式化字符串写入文件这些任务的第一个参数是文件描述符句柄,第二个参数是要存储的数据。要读取文件,必须以读取r模式或读写r+模式打开它。$ fgets()系统任务,它将从文件中读取一行。如果这个任务被调用10次,那么它将读取10。

        例子:下面显示的代码演示了如何使用 $display。然后以读取模式打开文件,并使用$ fgets()本地变量将内容读然后使用标准显示任务 $display打印出来。

module tb;int fd; // Variable for file descriptor handlestring line; // String value read from the fileinitial begin// 1. Lets first open a new file and write some contents into itfd = $fopen ("trial", "w");// Write each index in the for loop to the file using $fdisplay// File handle should be the first argumentfor (int i = 0; i < 5; i++) begin$fdisplay (fd, "Iteration = %0d", i);end// Close this file handle$fclose(fd);// 2. Let us now read back the data we wrote in the previous stepfd = $fopen ("trial", "r");// Use $fgets to read a single line into variable "line"$fgets(line, fd);$display ("Line read : %s", line);// Get the next line and display$fgets(line, fd);$display ("Line read : %s", line);// Close this file handle$fclose(fd);end
endmodule

2.1.4、阅读直到文件结束

        在前面的示例中,$fgets()两次使用系统任务从文件中读取两行。 Systemverilog有另一个任务调用$feof(),当到达文件未尾时返回tue。这可以在循环中使用,如下所示以读取文件的全部内容。例子。
 

module tb;int fd; // Variable for file descriptor handlestring line; // String value read from the fileinitial begin// 1. Lets first open a new file and write some contents into itfd = $fopen ("trial", "w");for (int i = 0; i < 5; i++) begin$fdisplay (fd, "Iteration = %0d", i);end$fclose(fd);// 2. Let us now read back the data we wrote in the previous stepfd = $fopen ("trial", "r");while (!$feof(fd)) begin$fgets(line, fd);$display ("Line: %s", line);end// Close this file handle$fclose(fd);end
endmodule

2.2.5、解析值的行

        System Verilog有另一个名为的系统任务 Sfscanf(),它允许我们扫描并获取某些值。
 

module tb;int fd; // Variable for file descriptor handleint idx;string str;initial begin// 1. Lets first open a new file and write some contents into itfd = $fopen ("trial", "w");for (int i = 0; i < 5; i++)$fdisplay (fd, "Iteration = %0d", i);$fclose(fd);// 2. Let us now read back the data we wrote in the previous stepfd = $fopen ("trial", "r");// fscanf returns the number of matcheswhile ($fscanf (fd, "%s = %0d", str, idx) == 2) begin$display ("Line: %s = %0d", str, idx);end// Close this file handle$fclose(fd);end
endmodule

2.1.6、多通道文件描述符

        mcd是一个32位压缩数组值,其中设置打开哪个文件。mcs的LSB总是指标准输出。输向到使用多通道描述符打开的两个或多个文件,方法是将它们的mcd按位或运算在写入结果值。

3、范围解析运算符::

        范围解析运算符∷用于引用类范围内的标识符。范围解析运算符∷的左侧应该是类类型名称、包名称、覆盖组类型名称、覆盖点或交叉名称、 typedef名称。运算符的右侧应该是_个标识符,如变量或方法名称。

3.1、使用范围解析运算符原因

        类和其他作用域可以具有相同的标识符名称,并且如果在未指定作用域的情况下被引用,则可能会产生命名空间冲突。范围解析运算符∷唯一标识给定类的成员或参数。它们还用于从类外部访问类的静态变量和方法、参数和局部参数。它还允许从子类中访问基类的公共和受保护成员。

3.1.1、定义外部函数

class ABC;
int data;
extern virtual function void display();
endclass
// Definition of an external function using scope
// resolution operator
function void ABC::display();
$display("data = 0x%0h", data);
endfunction
module tb;
initial begin
ABC abc = new();
abc.data = 32'hface_cafe;
abc.display();
end
endmodule

3.1.2、访问静态方法和函数

class ABC;static int data;static function void display();$display("data = 0x%0h", data);endfunctionendclassmodule tb;
initial beginABC a1, a2;// Assign to static variable before creating// class objects, and display using class_type and// scope resolution operator
ABC::data = 32'hface_cafe;
ABC::display();a1 = new();a2 = new();$display ("a1.data=0x%0h a2.data=0x%0h", a1.data, a2.data);
end
endmodule

3.1.3、使用包

package my_pkg;
typedef enum bit {FALSE, TRUE} e_bool;
endpackage
module tb;bit val;initial begin// Refer to types that have been declared// in a package. Note that package has to// be included in compilation but not// necessarily "imported"val = my_pkg::TRUE;$display("val = 0x%0h", val);end
endmodule

3.1.4、避免命名空间冲突

package my_pkg;
typedef enum bit {FALSE, TRUE} e_bool;
endpackage
import my_pkg::*;
module tb;typedef enum bit {TRUE, FALSE} e_bool;initial begine_bool val;
// Be explicit and say that TRUE from my_pkg// should be assigned to valval = my_pkg::TRUE;$display("val = 0x%0h", val);// TRUE from current scope will be assigned to// valval = TRUE;$display("val = 0x%0h", val);end
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习实战15-推荐算法-协同过滤在电影推荐中的应用实践

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战15-推荐算法-协同过滤在电影推荐中的应用实践。 随着互联网的发展&#xff0c;信息过载问题日益严重&#xff0c;推荐系统应运而生。本文将详细介绍推荐算法在电影推荐领域的应用实践&#xff0c;以及其…

【Python】--- 基础语法(1)

目录 1.变量和表达式2.变量和类型2.1变量是什么2.2变量的语法2.3变量的类型2.3.1整数2.3.2浮点数&#xff08;小数&#xff09;2.3.3字符串2.3.4布尔2.3.5其他 2.4为什么要有这么多类型2.5动态类型特征 3.注释3.1注释的语法3.2注释的规范 结语 1.变量和表达式 对python的学习就…

muduo网络库剖析——通道Channel类

muduo网络库剖析——通道Channel类 前情从muduo到my_muduo 概要事件种类channel 框架与细节成员函数细节实现使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#x…

多线程-Thread类及常见方法

目录 1.什么是Thread类 1.1Thread 的常⻅构造⽅法 1.2 Thread 的⼏个常⻅属性 2.启动⼀个线程 - start() 经典面试题&#xff1a;start 和run 区别 3.中断⼀个线程 方法一&#xff1a; 方法二: 4.等待⼀个线程 - join() 1.什么是Thread类 Thread类是Java编程语言中的一个重…

图像去噪——CTNet网络推理测试(详细图文教程)

目录 一、CTNet二、源码包准备2.1 测试集2.2 模型权重 三、环境准备四、推理测试4.1 配置参数修改4.2 官网测试4.2.1 测试当通道图像4.2.1.1 命令方式测试4.2.1.2 Configuration配置测试4.2.1.3 测试结果 4.2.2 测试彩色图像4.2.2.1 命令方式测试4.2.2.2 Configuration配置测试…

性能优化-HVX架构简介

来自 「发表于知乎专栏《移动端算法优化》」 本文主要介绍Hexagon DSP的HVX技术&#xff0c;旨在通过简单的语言讲清HVX技术。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开…

Elasticsearch 入门向使用

文章目录 ElasticSearch简介倒排索引安装(单节点)分词器kibana与Mysql概念上的对比索引库CRUD文档CRUDDSL查询相关性算分Function Score Query自定义算分Boolean Query 搜索结果处理排序分页高亮 数据聚合 aggregations自动补全数据同步集群 ElasticSearch 简介 Elasticsearc…

轻松掌握AI辅助设计微信红包封面并快速过审

【无矶之谈】轻松使用AI设计微信红包封面/动态封面并快速过审 关注本公众号梦无矶测开实录&#xff0c;2024年1月21日之后关注最新的文章&#xff0c;后台回复封面红包&#xff0c;即可免费领取本号专属微信红包封面。&#xff08;目前我过审的有五个封面&#xff0c;其中一个…

vue项目执行依赖安装(npm i或npm install )报ls-remote -h -t异常

从git拉取的vue项目执行依赖安装时一直报错&#xff0c; 报错如下图&#xff1a;首先&#xff0c;查看了node版本、npm配置的镜像地址均没找到解决办法。 在命令行中直接输入git发现提示于是从网上搜到了一个博文https://blog.csdn.net/weixin_49159364/article/details/118198…

仰暮计划|“每天清晨五六点钟,爷爷早早起床去田地里采摘蔬菜”

★ 我的奶奶出生于1955年&#xff0c;在我眼里是十分伟大的女性。身处在有六个兄弟姐妹的大家庭里&#xff0c;她从小就肩负起了照顾家人的重任。充满朝气的她&#xff0c;在上学和照顾弟弟妹妹之间穿梭。然而&#xff0c;在她将要上小学五年级的时候&#xff0c;文化大革命的爆…

[绍棠] docxtemplater实现纯前端导出word

1.下载需要的依赖 2.util文件夹下创建doc.js文件 doc.js import docxtemplater from docxtemplater import PizZip from pizzip import JSZipUtils from jszip-utils import { saveAs } from file-saver import ImageModule from "docxtemplater-image-module-free"…

力扣hot100 最长有效括号 动态规划

Problem: 32. 最长有效括号 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public int longestValidParentheses(String s){int n s.length();…

Python武器库开发-武器库篇之Fofa-API使用(四十六)

Python武器库开发-武器库篇之Fofa-API使用(四十六) FOFA&#xff08;FOcus Observation of Futures Assets&#xff09;是一款专业的网络资产搜索引擎&#xff0c;旨在帮助企业发现和评估网络上的潜在安全风险。FOFA的基本原理是通过搜索引擎的方式&#xff0c;按照关键词对互…

【Redis】更改redis中的value值

今天继续进步一点点~~ 背景&#xff1a;今天有个前端的同事问我&#xff0c;能不能在Redis中他本人登录公众号的 sessionID 加上一列openID 于是我上网查了一堆在Redis里面的命令&#xff0c;以及不同的客户端怎么输入命令&#xff0c;但是后来问了下同事&#xff0c;他就给我…

PDshell16逆向PostgreSQL 工程显示字段comment备注

现状&#xff1a;当刚逆向成功的表结构是没有原来表结构中的&#xff0c;comment备注如下 然后pd逆向工程的sql已经返回了这个备注的含义 解决方案&#xff1a; 1、设置显示注释列 tools——Display Preferences…如下 勾选-按照下面得方式勾选这三个 复制这里的VBS脚本&a…

OpenVINS学习7——评估工具的简单使用

前言 OpenVINS自带评估工具&#xff0c;这里记录一下使用方法&#xff0c;我是以VIRAL数据集为例&#xff0c;但是目前仍然有问题&#xff0c;发现误差很大&#xff0c;我还没搞明白哪里出了问题。 工具介绍 主要参考 https://docs.openvins.com/eval-error.html https://bl…

Windows和Linux访问不了GitHub的解决方法

一、Windows访问不了GitHub 问题描述 使用Windows访问GitHub时&#xff0c;出现如下情况&#xff0c;显示无法访问。 解决方案&#xff1a; 打开域名查询网站&#xff1a;https://tool.chinaz.com/dns 输入GitHub的域名&#xff0c;点击立即检测。 出现如下页面&#xff0c…

实验五 PLSQL编程

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

git设置代理

git设置代理 git config --global http.proxy 127.0.0.1:7890git查询代理 git config --global http.proxy git取消代理 git config --global --unset http.proxy

【核心复现】基于改进鲸鱼优化算法的微网系统能量优化管理matlab

目录 一、主要内容 1 冷热电联供型微网系统 2 长短期记忆网络(Long Short Term Memory, LSTM) 3 改进鲸鱼优化算法 二、部分代码 三、运行结果 四、下载链接 一、主要内容 该程序为《基于改进鲸鱼优化算法的微网系统能量优化管理》matlab代码&#xff0c;主要内容如下&…