尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Verilog基础:$readmemb和$readmemh系统任务的使用与其中的初始化地址相关问题(详细细节)
相关阅读Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482$readmemb和$readmemh两个系统任务用于将文件中的数据加载到存储器或者被称为数组的memory中。首先给出他们的语法的BNF范式有关BNF范式的内容可以在之前的文章中找到首先要注意的是作为系统任务的一类这些语句都是能在过程块initial和always中使用的。load_memory_tasks分为两类一类是以二进制解析文件中的数据而另一类是以十六进制解析。特别提醒$readmemb和$readmemh中美元符$和后面的关键词之间必须连续不能有空白。file_name指的是要读取数据的文本文件名文件名可以使用绝对路径从根目录开始的路径使用/开头和相对路径使用./或../开头./可省略这里的相对路径指的是相对仿真器的当前工作文件夹。要读取数据的文件有以下三点要求用于分隔数字的空白字符空格、换行符、制表符、换页符注释两种形式的注释都可以即//或/* */二进制或十六进制数字这里指的是纯数字不含任何其他指示性的符号即111fff这种且不能包含正负号、-memory_name指的是需要初始化的存储器名数字的长度不能高于存储器的数据位宽否则当读取到不符合要求的数据会报错无法继续读取。未知值x或X、高阻抗值z或Z和下划线_可用于指定数字应使用若干空白字符和/或注释来分隔数字下面是一些例子。test.v module test(); reg [7:0]data[7:0];//和reg [7:0]data[0:7];效果相同 initial $readmemb(../data.txt, data); endmodule data.txt //前5个数据正常读取直到0b报错无法解析 11 01 11111 11 100 0b101 110 111 1000 001 100001 //第一个数据太大了报错无法解析 11111111111 11 01 11111 11 //可以在数字中插入_ 11_00 1122 2344 //可以用换行符分隔 11 22 33 //可以用注释分隔数字 11/*55555*/01 11111 11 100 //可以在数字中使用x或z z1 x1 11 12当指定的数字位宽小于存储器的位宽时将会进行位宽拓展这里的拓展规则只和数据有关而与存储器变量的类型无关类似于Verilog基础表达式中的整数常量integer一文中“无符号数字的位宽小于位宽常数指定的大小”一样如果数字最高位是1或0则补0至存储器的数据位宽如果是z则补z如果是x则补x。当文件数据被从上至下从左至右读取时每个数据被分配给索引从低到高的各个存储器变量寻址可以通过在系统任务调用中指定开始和/或结束地址以及在数据文件中使用符号指定地址来控制。当地址出现在数据文件中时格式为字符后跟十六进制数字如下所示hhh HHH HhH 1h1 //错误数字中允许同时使用大写和小写数字。和数字之间不允许有空格可以使用数据文件中所需的任意多的地址规范当系统任务遇到地址规范时它会从该内存地址开始加载后续数据并将数据填入对应地址索引的寄存器变量中。文件中的所有数字都有默认的地址分为几种情况如果系统任务中没有规定起始地址和终止地址数据文件中也没有显式的地址则数据的默认地址为从寄存器变量的最小地址开始依次加1。读取将从寄存器变量的最小地址开始依次读取后面的数据直到有一个数据的默认地址大于寄存器变量的最大地址因为此时的数据地址范围要求为从寄存器变量的最小地址到最大地址之间或者数据读完。举例说明如下所示。test.v module test(); reg [7:0]data[7:1]; initial $readmemb(data.txt, data);//地址范围1到7 endmodule data.txt //data[5], data[6], data[7]未初始化 00 //地址为1 01 //地址为2 10 //地址为3 11 //地址为4 data.txt //恰好全部初始化 00 //地址为1 01 //地址为2 10 //地址为3 11 //地址为4 00 //地址为5 01 //地址为6 10 //地址为7 data.txt //全部初始化 00 //地址为1 01 //地址为2 10 //地址为3 11 //地址为4 00 //地址为5 01 //地址为6 10 //地址为7 11 //地址为8当试图读取这个数时会提示超出范围Too many data words read on line 8 of file //并结束读取如果系统任务中只规定了起始地址它必须在存储器的地址范围内数据文件中也没有显式的地址则数据的默认地址为从起始地址开始依次加1。读取将从起始地址开始依次读取后面的数据直到有一个数据的默认地址大于寄存器变量的最大地址因为此时的数据地址范围要求为从寄存器变量的最小地址到最大地址之间或者数据读完。举例说明如下所示。test.v module test(); reg [7:0]data[7:1]; initial $readmemb(data.txt, data, 2);//起始地址为2必须在1到7之间则地址范围是2到7 endmodule data.txt //data[1]和data[6], data[7]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 11 //地址为5 data.txt //data[1]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 11 //地址为5 00 //地址为6 01 //地址为7读取完这个数据遇到文件结束结束读取 data.txt //data[1]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 11 //地址为5 00 //地址为6 01 //地址为7 10 //地址为8当试图读取这个数时会提示超出范围Too many data words read on line 7 of file //并结束读取如果系统任务中规定了起始地址和结束地址它们必须在存储器的地址范围内数据文件中也没有显式的地址则数据的默认地址为从起始地址因此它必须在存储器的地址范围内开始依次加1或减1这取决于起始地址和结束地址的大小如果结束地址大于起始地址则为加1否则为减1。读取将从起始地址开始依次读取后面的数据直到有一个数据的默认地址大于寄存器变量的最大地址或小于最小地址因为此时的数据地址范围要求为从寄存器变量的最小地址到最大地址之间或者数据读完。举例说明如下所示。test.v module test(); reg [7:0]data[7:1]; initial $readmemb(data.txt, data, 2, 5);//起始地址为2终止地址为5必须在1到7之间则地 //址的范围是2到5默认地址递增 endmodule data.txt //data[1], data[5], data[6], data[7]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 data.txt //data[1]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 11 //地址为5 00 //地址为6 01 //地址为7读取完这个数据遇到文件结束结束读取 data.txt //data[1]未初始化 00 //地址为2 01 //地址为3 10 //地址为4 11 //地址为5 00 //地址为6 01 //地址为7 10 //地址为8当试图读取这个数时会提示超出范围Too many data words read on line 7 of file //并结束读取test.v module test(); reg [7:0]data[7:1]; initial $readmemb(data.txt, data, 5, 2);//起始地址为5终止地址为2必须在1到7之间则地 //址的范围是2到5默认地址递减 endmodule data.txt //data[1], data[2], data[6], data[7]未初始化 00 //地址为5 01 //地址为4 10 //地址为3 data.txt //data[1], data[6], data[7]未初始化 00 //地址为5 01 //地址为4 10 //地址为3 11 //地址为2读取完这个数据遇到文件结束结束读取 data.txt //data[1], data[6], data[7]未初始化 00 //地址为5 01 //地址为4 10 //地址为3 11 //地址为2 00 //地址为1当试图读取这个数时会提示超出范围Too many data words read on line 5 of file //并结束读取 01 //地址为0现在我们来看数据文件中有显式的地址标识时的情况第一个地址标号规定了其前后的地址后面的地址标号规定了其后的地址根据上面的规则可以是递增也可以是递减。如下所示。data.txt //系统任务中起始地址小于终止地址或没有终止地址或没有起始和终止地址则递增 00 //地址为-2 01 //地址为-1 10 //地址为0 1 00 //地址为1 01 //地址为2 10 //地址为3 7 00 //地址为7 01 //地址为8 10 //地址为9 data.txt //系统任务中起始地址大于终止地址则递减 00 //地址为9 01 //地址为8 10 //地址为7 11 //地址为6 5 00 //地址为5 01 //地址为4 10 //地址为3 11 //地址为2 6 00 //地址为6 01 //地址为5 10 //地址为4 11 //地址为3在读取有地址标号的文件时首先会定位到地址和起始地址相同的那条数据当没有起始地址时是定位到存储器对应的最小地址上面的第一种情况中为1然后开始从左到右从上到下一条一条数据依次读取数据直到文件结束所以可能会出现初始化覆盖的情况如下所示或者有数据的地址超出了范围才结束读取。test.v module test(); reg [7:0]data[7:1]; initial $readmemb(data.txt, data, 2);//起始地址为2必须在1到7之间则地址范围是2到7 endmodule data.txt 00 //地址为-1 01 //地址为0 10 //地址为1 11 //地址为2, 从这里开始读取 3 00 //地址为3 01 //地址为4 10 //地址为5 11 //地址为6 0 00 //地址为1 00 //地址为2覆盖了地址为2的原值11 11 //地址为3覆盖了地址为3的原值00 00 //地址为4覆盖了地址为4的原值01 data.txt 00 //地址为-1 01 //地址为0 10 //地址为1 11 //地址为2, 从这里开始读取 3 00 //地址为3 01 //地址为4 10 //地址为5 11 //地址为6 11 //地址为7 11 //地址为8当试图读取这个数时会提示超出范围Too many data words read on line 11 of //file并结束读取因此后面不会覆盖 0 00 //地址为1 00 //地址为2 11 //地址为3 00 //地址为4
RELATED

相关推荐

Verilog基础:延迟模型

Verilog基础:延迟模型

相关阅读 Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 目录 1、连续赋值延迟 1.1、赋值内嵌延迟 1.2、线网声明延迟 1.3、门延迟 2、过程赋值延迟 2.1、过程语句前置时序控制 2.2、过程赋值语句内嵌时序控制…

📅 2026/11/6 1:12:58
技术内容创作的安全边界与合规实践指南

技术内容创作的安全边界与合规实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/6 1:07:58
多通道射频幅相一致性产线测试方案设计

多通道射频幅相一致性产线测试方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/6 1:07:58
MORE NEWS

更多资讯

📰

小程序抓包抓不到明文:SSL校验分层与绕过验证

简介:该资源聚焦于支付宝小程序 SSL 验证机制的研究与调试场景,面向从事移动端抓包分析、接口调试及安全测试的开发者与进阶学习者,提供借助 Frida 动态注入与代理工具绕过证书校验、恢复小程序网络流量可见性的实践素材。压缩包共 3 个文件&…

📰

Windows Server 2012/2016 RAID驱动加载与DISM注入

简介:面向在 Windows Server 2012 R2 和 2016 64 位环境中部署、维护 530 与 930 系列 RAID 阵列卡的服务器管理员和运维人员,这份驱动集合用于解决系统无法正确识别阵列卡、RAID 功能不可用以及存储性能难以正常发挥等问题,适合物理服务器、…

📰

530/930 RAID阵列卡驱动:Windows Server装机与DISM注入排错

简介:面向在 Windows Server 2012 R2 与 2016 环境中维护 530、930 系列阵列卡的管理员和运维人员,这套驱动集合用于解决系统无法正确识别阵列卡、RAID 功能不可用及安装部署阶段的兼容性问题,也可作为服务器重装或磁盘阵列排障时的驱动备份。…

📰

Java Swing森林冰火人单人版小游戏源码:瓦片地图与AABB碰撞解析

简介:这份Java小游戏项目以森林冰火人单人版为主题,面向Java初学者、课程设计学生及游戏开发入门者,帮助读者通过一个可运行的案例理解图形界面、事件处理与基础游戏逻辑。压缩包共78个文件,约2.98MB,包含6个java源码、…

📰

CNN人脸识别全流程:MTCNN对齐、ArcFace训练与部署

简介:面向深度学习与人脸识别入门学习者的CNN实战代码包,围绕Olivetti人脸数据集,提供从模型训练到识别调用的完整可运行示例,适合已具备Python基础、希望理解卷积神经网络在人脸分类任务中落地方式的学生与开发者参考。压缩包共4…

📰

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万 去银行申请几千万元贷款,企业通常要带上什么?房产证、土地证、厂房设备发票,或者厚厚一叠抵押担保合同。但在2026年11月初的江苏,两家实体企业走进交通银行…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬