Verilog:$readmemb和$readmemh系统函数的使用与其中的初始化地址相关问题(详细细节)

2023-09-22 12:58:37

相关阅读

Verilog基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12263729.html?spm=1001.2014.3001.5482


        $readmemb和$readmemh两个系统函数用于将文件中的数据加载到存储器或者被称为数组的memory中。首先给出他们的语法的BNF范式,有关BNF范式的内容可以在之前的文章中找到:

        首先要注意的是,作为系统函数的一类,这些语句都是能在过程块initial和always中使用的。

        load_memory_tasks分为两类,一类是以二进制解析文件中的数据,而另一类是以十六进制解析。特别提醒,$readmemb和$readmemh中美元符$和后面的关键词之间必须连续,不能有空白。

        file_name指的是要读取数据的文本文件名,文件名可以使用绝对路径或相对路径,相对指的是相对当前仿真器的工作目录(一般为项目文件所在文件夹)。

        要读取数据的文件有以下三点要求:

  • 用于分隔数字的空白字符(空格、换行符、制表符、换页符)
  • 注释(两种形式的注释都可以,即//或/* */)
  • 二进制或十六进制数字(这里指的是纯数字,不含任何其他指示性的符号,即111,fff这种,且不能包含正负号+、-)

        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,

更多推荐

5G技术与教育的融合:挑战与机遇

5G技术与教育的融合:挑战与机遇摘要:本文旨在探讨5G技术在教育领域的应用及其对教育产业的潜在影响。首先,我们将简要介绍5G技术和现代教育技术的背景和现状。接着,我们将详细讲解5G技术在教育领域的应用,包括教学场景、互动模式和教育内容等方面,并通过实际案例进行分析。随后,我们将对5G技术在教育中的优缺点进行深入探讨,提

解锁前端Vue3宝藏级资料 第五章 Vue 组件应用 1( Props )

本章带领大家理解组件、props、emits、slots、providers/injects,Vue插件等Vue组件使用的基础知识。5.1组件注册5.2Props5.2.1组件之间如何传值5.2.2参数绑定v-bind5.2.3参数类型5.2.4props默认与必填5.2.5验证设置5.2.6useAttrs属性设置第

大数据名词——MPP(Massively Parallel Processing)数据集市

MPP(MassivelyParallelProcessing)数据集市是指一种基于大规模并行处理的数据存储和分析平台,旨在支持高效的数据处理和查询。MPP数据集市通常由多个节点组成,每个节点都具备计算和存储能力,并且可以同时处理大量的数据。MPP数据集市的主要特点包括以下几个方面:1.并行处理能力:MPP数据集市使用

知识产权之围:跨境电商卖家的法律防线

在当今数字化全球市场中,跨境电商是企业扩大国际业务的重要途径。然而,随着全球贸易的复杂化,知识产权问题已成为跨境电商卖家必须面对的挑战之一。本文将通过一个具体案例来探讨知识产权的重要性以及跨境电商卖家如何建立法律防线来保护自己的创意和品牌。Sophia'sBoutique的知识产权之困Sophia是一位富有创造力的跨境

Springboot项目升级2.2.x升至2.7.x

依赖管理spring-boot-starter-parent升级为2.7.1<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><!--升级为2.7.x的版本--><v

压力测试:Jmeter自动化测试详解

1、Jmeter的安装与部署1.1环境要求jdk1.8、配置jdk环境变量(JAVA_HOME:C:\ProgramFiles\Java\jdk1.8.0_101Path:;%JAVA_HOME%\bin;CLASSPATH:%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar)1.2安装

半导体IC电子器件需要老化吗?

前言本文表明,基于初始时刻故障率的时间导数的浴盆曲线(BTC)可以被视为老化测试(BI​​T)是否应该进行的合适标准。进行。还表明,上述标准实际上是产品制造商从众多供应商处收到的批量生产组件的随机统计故障率(SFR)的方差,这些供应商对可靠性的承诺是未知的,并且它们的随机SFR因此,可能会在一个非常大的范围内变化,从零

国内首家!阿里云 Elasticsearch 8.9 版本释放 AI 搜索新动能

简介:阿里云作为国内首家上线Elasticsearch8.9版本的厂商,在提供ElasticsearchRelevanceEngine™(ESRE™)引擎的基础上,提供增强AI的最佳实践与ES本身的混合搜索能力,为用户带来了更多创新和探索的可能性。近年来,人工智能的快速发展和广泛应用在各个行业中都取得了显著的成果。在搜

2023年中国研究生数学建模竞赛D题解题思路

为了更好的帮助大家第一天选题,这里首先为大家带来D题解题思路,分析对应赛题之后做题阶段可能会遇到的各种难点。稍后会带来D题的详细解析思路,以及相关的其他版本解题思路成品论文等资料。赛题难度评估:A、B>C>E、F>D选题人数评估:D>E、F>C>A、BD题区域双碳目标与路径规划研究以当下热门话题双碳碳中和为命题背景设置

内网穿透的应用-Cloudreve搭建云盘系统,并实现随时访问

文章目录1、前言2、本地网站搭建2.1环境使用2.2支持组件选择2.3网页安装2.4测试和使用2.5问题解决3、本地网页发布3.1cpolar云端设置3.2cpolar本地设置4、公网访问测试5、结语1、前言自云存储概念兴起已经有段时间了,各互联网大厂也纷纷加入战局,一时间公有云盘遍地开花。但一段时间后,公有云盘潜在的

【2023全网最全最火】Selenium WebDriver教程(建议收藏)

在本教程中,我将向您介绍SeleniumWebdriver,它是当今市场上使用最广泛的自动化测试框架。它是开源的,可与所有著名的编程语言(如Java、Python、C#、Ruby、Perl等)一起使用,以实现浏览器活动的自动化。通过本文,我将告诉您开始使用SeleniumWebDriver测试Web应用程序所需了解的所

热文推荐