资讯动态

FPGA应用开发和仿真【1.9】

发布时间:2026/8/30 4:39:46 来源:尧图企业网站定制
2.14 接口初学者可跳过此节当觉得在很多模块中写一模一样的长长的端口定义很烦琐时可再来学习本节。接口用来将多个相关的端口组织在一起为了说明接口的作用先考虑下面代码代码2-40 存储器及其测试第一个模块mem描述了一个带有同步复位的存储器存储单元是用数组描述的输出是先读模式模块内的代码应容易理解此处不赘述。第二个模块mem_tester用测试存储器它在clk的驱动下产生了递增的addr和数据并一直将wr置1。第三个模块是顶层实例化前两者并产生前两者共同需要的clk和rst信号。从这个例子中可以看出存储器需要用到的几个端口addr、d、wr、q、clk和rst在模块端口定义中出现了两次在顶层模块中定义了它们并在模块实例化时重复书写了两遍。对于更复杂的设计可能存在更多的模块需要用到同样的端口全部分散书写出来降低了代码效率、可读性和可维护性。接口可以将众多端口组织在一起形成一个模板在需要时实例化接口便可使用一个标识符引用。接口定义的常用形式如下其中其他内容可以是参数/常量定义、任务或函数。接口内部定义的线网或变量是应用该接口的模块内需要用到的端口而定义在接口头部的外部共享端口还可以在实例化接口时与接口外部的线网或变量连接。modport关键字引导角色定义用于指定不同端口在接口的不同角色比如主、从、监听下的方向。接口的实例化与模块的实例化形式几乎一样此处不赘述。在模块的端口定义列表中引用接口时可使用“接口名.[角色名]”的形式在模块中引用接口内的端口时使用“接口名.[端口名]”的形式。使用接口可将代码2-40修改为代码2-41。代码2-41 存储器及其测试2.15 生成块初学者可跳过此节当觉得在模块中重复写类似的有规律的内容比较烦琐时再来学习本节。代码2-42 8位格雷码到二进制码转换生成块可根据一定的规律使用条件生成语句、循环生成语句等重复构造生成块的内容等效于按照规律重复书写了生成块中的内容。考虑代码2-42。该代码描述了一个将8位格雷码转换到二进制码的组合逻辑可以看到书写了8行很有规律的持续赋值。试想如果需要像这样描述64位格雷码到二进制码的转换呢如果需要参数化位数呢生成块可完成类似的需求。生成常用形式如下其中for生成语句的形式为这与过程中的for语句形式相似不过循环条件所用的变量必须使用genvar关键字定义循环步进和条件必须只由生成变量决定。if生成语句和case生成语句的形式与过程中的if语句和case语句相似不过所有的条件表达式必须是常量表达式。生成语句中的生成内容与模块中能包含的内容基本一致生成内容中还可以再嵌套其他生成语句。如果使用生成块代码2-42可参数化改写为代码2-43。代码2-43 参数化位数的格雷码到二进制码转换2.16 任务和函数任务和函数将一些语句实现的一定功能封装在一起以便重复使用。任务和函数都只能在过程块中调用。任务定义的一般形式函数定义的一般形式其中的static和automatic关键字用于指定任务和函数的生命周期使用automatic关键字的任务和函数中的变量均为局部变量在每次任务或函数调用时均会重新初始化可被多个同时进行的过程调用或被递归调用类似于编程语言的可重入。FPGA开发工具一般只支持automatic类型的任务和函数。任务和函数本身类似于顺序块因而在顺序块中能使用的语句过程赋值、流程控制等都能在任务和函数中使用。任务中可以有时序控制延时、事件而函数中不能有。代码2-44是任务和函数的例子。代码2-44 任务和函数示例第4行的任务gen_reset用于在reset上产生复位信号第14行的函数用于求输入x的底2对数。2.17 包包package用来封装一些常用的常量变量定义、数据类型定义、任务和函数定义等在需要使用时可使用import关键字导入。包定义的形式是引用包时使用使用内容名数据、数据类型、任务、函数等时只导入相应内容使用“*”时将导入包内全部内容。import语句可以用在模块内也可以用在模块头部。代码2-45是包的例子。代码2-45 包的示例这个例子在Q15Types包中定义了Q15Q1.15格式和CplxQ15数据类型并定义了CplxQ15的加法和乘法运算。第15行之后的testpackage模块中对CplxQ15类型的乘法进行测试。Verilog规范中还定义了一些标准包包括信号量、邮箱、随机和进程可用于复杂测试代码的编写读者可适当了解。2.18 系统任务和函数系统任务和函数是标准中定义的用于在仿真和编译过程中执行一些特殊功能的任务和函数全部以“”符号开头有的可带参数有的无参数无参数或可不带参数的系统任务和函数在调用时可以不带括号。大多数系统任务和函数都应该在过程中被调用。系统任务和函数本身都是不能综合成实际电路的主要用于仿真测试。但部分任务和函数会干预综合过程影响综合结果是可综合的代码中有用的内容比如类型转换和存储器相关函数和任务。标准中定义的系统任务和函数有近两百个这里介绍一些常用的。1显示相关display、write、strobe、monitor。2文件相关fopen、fclose、fdisplay、fwrite、fstrobe、fmonitor、fscanf。3存储器相关readmemh、readmemb、writememh、writememb。4仿真相关stop、finish。5错误和信息fatal、error、warning、info。6类型转换itor、rtoi、bitstoreal、realtobits、bitstoshortreal、shortrealtobits。7数学clog2、ceil、floor、ln、log10、exp、pow、sqrt、sin、cos、tan、asin、acos、atan、atan2、hypot、sinh、cosh、tanh、asinh、acosh、atanh。其他部分系统任务和函数在后续章节中也会有些许提及未提及的系统任务和函数读者可查阅标准适当了解。2.18.1 显示相关显示相关任务的一般使用形式是这些任务将把待显示的内容输出到仿真环境的终端或仿真工具的控制台窗口。参数可以是字符串以双引号包裹、线网、变量或带有返回值的表达式。如果是字符串还可在字符串中加入格式说明每个格式说明将按次序对应后面一个参数并按照一定的格式被后面的对应参数替换。没有对应格式说明的参数如果是紧凑类型将按默认格式显示如果是非紧凑类型则只有字节数组会按照字符串显示其他会被认为不合法。display用于即时显示并会在最后添加换行。write用于即时显示但不会添加换行。strobe会在一个仿真时间步的最后显示即当同时并行执行的所有语句执行完之后它才会输出显示常用于检测每个时间步线网或变量的变化结果。monitor一经运行便会在引用到的任何一个变量发生变化时输出一次显示可用于持续监测线网或变量的变化。字符串中的格式说明均以“%”开始常用的格式说明如表2-12所示。表2-12 格式说明符说明符对于整数显示宽度与该整数位宽下所能表达的最大数值的宽度一致如对于16位无符号数十六进制宽4位、十进制宽5位、八进制宽6位、二进制宽16位。如果数值达不到显示位宽则十进制高位填充空格其他进制填充0。也可指定最小显示位宽形式为“%最小位宽h|d|o|b”其中的最小位宽为非负整数如果实际数值窄于这个值则填充空格或0如果实际数值宽于这个数值则扩展显示宽度。二进制显示时为z或x的位显示“z”或“x”。八进制或十六进制显示时如果对应的3位或4位·全是z或x则显示“z”或“x”。·不全是但含有x则显示“X”。·不全是但含有z且不含x则显示“Z”。十进制显示时如果所有位·全是z或x则显示“z”或“x”。·不全是但含有x则显示“X”。·不全是但含有z且不含x则显示“Z”。字符串也可用同样的形式指定显示的宽度窄于指定宽度的左侧填充空格宽于指定宽度的扩展宽度显示。对于浮点数%e、%f、%g可指定左右对齐、显示宽度和小数位数形式为“%|-宽度.小数位e|f|g”其功能与C语言格式输出的格式说明完全兼容规则较为复杂在FPGA设计中也很少用到读者可参考C语言相关资料这里不赘述。2.18.2 文件相关文件相关任务和函数用于读写EDA工具运行的计算机上的文件可用于读取激励文件、写仿真结果到文件等。fopen用于打开文件并返回一个用于后续访问打开的文件的描述符形式如下或其中多通道描述符是32位二进制整数每一位代表一个通道第0位默认代表标准输出同显示任务采用多通道描述符可以将输出信息同时写入多个文件含标准输出中只需要将多个通道的描述符按位或用作描述符即可。文件描述符也是32位二进制整数不过每个数值代表一个文件0、1、2默认为标准输入、标准输出和标准错误。文件名和类型都是字符串文件名可以带有相对路径或绝对路径类型则如表2-13所示。表2-13 打开文件的类型close用于关闭文件形式如下文件一旦关闭便不能再读写已使用fmonitor和fstrobe任务发起的读写操作将被隐式地取消。fdisplay、fwrite、fstrobe和fmonitor几个任务的使用方式如下除增加了多通道或文件描述符作为第一个参数其他与对应的显示任务几乎一样当然内容从显示到终端变成了写入文件。fscanf用于以一定的格式从文件中读入数据形式如下其中的格式说明与显示任务的格式说明类似可以使用一连串多个格式说明符匹配多个变量从文件中读取文本内容并按指定格式转换后赋值给变量。对于整数和字符串每个说明符匹配到空白空格、制表符、换行等前的一段内容对于字符每个说明符匹配一个字符对于时间还将四舍五入到系统的时间精度对于层次路径直接返回当前层次路径并不读文件。Integer类型的返回值表示成功匹配并赋值的变量个数如果为-1表示文件已结束。除了上述这些文件操作任务和函数外还有二进制读函数fread、获取操作位置的函数ftell、设定操作位置的函数fseek和重置操作位置的函数rewind这里不赘述读者可参考标准文档。2.18.3 存储器相关存储器相关的任务用于从文件中读取内容来初始化存储器或将存储器的内容保存到文件中。所谓存储器就是整型数组。readmemh和readmemb分别从文件中读取十六进制和二进制文本到存储器中。形式是其中文件名对应的文件的内容必须符合以下规则·只能包含空白、注释行注释或块注释、“”字符和常数常数由z、Z、x、X和对应进制的数字组成。·被空白或注释分隔的数表达数据每个数据内容对应数组中的一个元素。·“”字符后紧跟的数表达地址必须是十六进制指定下一个数据的地址。·未被指定地址的数据的地址为前一数据地址加1文件开头先出现数据时该数据地址为0。典型的可用于readmemh任务的文件内容注意左侧为行号并非文件内容如下writememh和writememb分别将存储器中的内容以十六进制形式或二进制形式写入文件。形式是写到文件里的内容符合上面的规则并且一般带有“”开头的地址除非数组元素为非紧凑类型。2.18.4 仿真相关stop用于暂停仿真finish用于结束仿真它们的使用形式如下可带圆括号或不带圆括号可带参数或不带参数。带参数0表示不显示信息到终端带参数1表示显示仿真时间和位置到终端带参数2表示显示仿真时间、位置以及仿真占用计算机CPU和存储器的统计信息。不带参数等价于带参数1。2.18.5 错误和信息fatal、error、warning、info用于在编译期准确地说是展述时或在仿真运行时给出严重错误、错误、警告和信息。严重错误将终止展述或仿真错误不会终止展述或仿真但展述时如出现错误将不会启动仿真警告和信息只给出信息。它们经常用来做编译时的常量和参数合法性的报告或运行时变量合法性的报告也常常用来做测试时功能校验的报告。它们都类似显示任务可带有字符串或常量、变量表达式作为参数并支持字符串中的格式说明符。fatal则多一个结束号参数。它们的使用形式如下2.18.6 类型转换和数学函数1.类型转换函数itorx将整型数据x转换为real型双精度浮点。rtoix将real型数据x转换为integer型。bitstorealx将符合IEEE 754规范的64位编码x转换为real型。realtobitsx将real型数据x转换为符合IEEE 754规范的64位编码。bitstoshortrealx将符合IEEE 754规范的32位编码x转换为shortreal型。shortrealtobitsx将shortreal型数据x转换为符合IEEE 754规范的32位编码。例如cast、signed和unsigned三个函数在2.8节已有介绍此处不赘述。2.数学函数clog2x返回不小于x的以2为底的对数的最小整数。ceilx返回不小于x的最小整数。floorx返回不大于x的最大整数。以上三个返回值为整数以下返回值均为real型。lnx返回x的自然对数。log10x返回x的常用对数。expx返回e自然对数的底的x次幂。powxy返回x的y次幂等价于x**y。sqrtx返回x的平方根。sinx、cosx、tanx返回x弧度的正弦、余弦和正切。asinx、acosx、atanx返回x的反正弦、反余弦和反正切均为弧度。atan2yx返回复数xyi的辐角值域为-ππ。hypotxy返回复数xyi的模。sinhx、coshx、tanhx返回x的双曲正弦、双曲余弦和双曲正切。asinhx、acoshx、atanhx返回x的反双曲正弦、反双曲余弦和反双曲正切。内容由AI生成

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价