SystemVerilog声明的位置

SystemVerilog声明的位置

1、包(package)
(1)包的定义
SystemVerilog的包在package和endpackage之间定义
包中可以包含的可综合的结构有
(1)parameter和localparam常量定义
(2)const变量定义
(3)typedef用户定义类型
(4)全自动task和function定义
(5)从其他包中import语句
(6)操作符重载定义

在包中还可以进行全局变量声明、静态任务定义和静态函数定义。但是这些是不可综合的。

包是一个独立的声明空间,不需要包含在Verilog模块中。

package definitions;paramter VERSION = "1.1";typedef enum{ADD,SUB,MUL} opcodes_t;typedef struct{logic [31:0] a,b;opcodes_t opcode;}instruction_t;function automatic [31:0] multiplier(input [31:0] a,b);//用户定义的32位乘法return a*b;endfunction
endpackage

包中的参数不能重新定义
包中可能包含parameter、localparam和const等常量定义。paramter和localparam常量是Verilog结构。const常量是SystemVerilog常量。在Verilog中,模块(module)的每个实例可以对paramter常量重新定义,但不能对localparam常量重新定义。但是在包中的paramter不能被重新定义,因为它不是模块实例的一部分。在包中,parameter和localparam是相同的。

(2)引用包的内容
模块和接口可以用四种方式引用包中的定义个声明
(1)用范围解析操作符直接引用
(2)将包中特定子项导入到模块或接口中。
(3)用通配符导入包中的子项到模块或接口中
(4)将包中子项导入到$unint声明域中

::用来引用包中的子项

使用作用域解析操作符进行包的引用
相对于Verilog,SyetemVerilog增加了作用域解析操作符“::”。这一操作符允许通过包的名称直接引用包,然后选择包中特定的定义或声明。包名和包中子项由双冒号(::)隔开。

使用::作用域解析操作符进行包的引用(有利于源代码的可读性,但是,当包中的一项或多项需要在模块中多次引用时,每次显示地引用包的名称太过于麻烦了,我们可能希望将包中子项导入到设计块中)

module ALU
(	input definitions::instruction_t IW,input logic clock,output logic[31:0]  result
);
always_ff @(posedge clock)
begincase(IW.opcode)definitions::ADD  : result = IW.a + IW.b;definitions::SUB  : result = IW.a - IW.b;definitions::MUL  : result = definitions::multiplier(IW.a,IW.b);endcase
end
endmodule

导入包中的特定子项
SystemVerilog允许用import语句将包中特定子项导入到模块中。当包中定义或声明导入到模块或接口中时,该子项在模块或接口内是可见的,就好像它是该模块或接口内是可见的,就好像它是该模块或接口中的一个局部定义名一样,这样就不需要每次引用包中子项时都显示引用包名。导入包定义或声明可以简化模块中的代码。

module ALU
(	input definitions::instruction_t IW,input logic clock,output logic[31:0]  result
);
import definitions::ADD;
import definitions::SUB;
import definitions::MUL;
import definitions::multiplier;
always_comb @(posedge clock)
begincase(IW.opcode)ADD  : result = IW.a + IW.b;SUB  : result = IW.a - IW.b;MUL  : result = multiplier(IW.a,IW.b);endcase
end
endmodule

注意:导入枚举类型定义并不导入那个定义使用的元素

import definitions::opcode_t //该导入语句不会起作用

这个导入语会使用户定义的类型opcode_t在模块中可见。但是它不会使opcode_t中使用的枚举元素可见。为了使元素在模块内成为可见的局部名称,每个枚举元素必须显示导入。当有许多子项需要从包中导入时,使用通配符导入更使用。

包中子项的通配符导入
SystemVerilog允许包中子项使用统配符导入,而不用指定包中子项名称,通配符记号是一个星号(*)

import definitions::*;//通配符导入
//通配符导入可使包中所有子项都成为可见的
//通配符导入并不自动导入整个包

当使用通配符导入包中子项时,只有在模块或接口中实际使用子项才会被真正导入。没被引用的包中的定义和声明不会被导入。
模块或接口内的局部定义和声明优先于通配符导入。包中指定子项名称的导入也优先于通配符导入。从设计者的角度来看通配符导入只是简单地将包添加到标识符(identifier)搜索规则中。软件工具先搜索局部声明,然后在通配符导入的包中搜索,最后工具将在$unit声明域中搜索。

module ALU
(	input definitions::instruction_t IW,input logic clock,output logic[31:0]  result
);
import definitions::*;//通配符导入always_comb @(posedge clock)
begincase(IW.opcode)ADD  : result = IW.a + IW.b;SUB  : result = IW.a - IW.b;MUL  : result = multiplier(IW.a,IW.b);endcase
end
endmodule

对于模块中端口IW,包名仍须显示引用,因为不能在关键字module和模块端口定义之间加入一个import语句。但是有一种方法可以避免在端口列表中显示引用包的名称,那就是使用$unit声明域。

为了综合,包中的任务和函数必须是自动的
当模块引用一个包中定义的任务或函数时,综合会复制该任务或函数的功能并把它看做是已经在模块中定义了的。为了能够综合,包中定义的任务和函数必须声明为automatic,并且不能包含静态变量。这是因为自动任务和函数的储存区在每次调用时才会分配。因此引用包中自动任务或函数的每个模块看是不是被其他模块共享的该任务或函数储存区的唯一副本。这就保证了综合前对包中任务或函数引用的仿真行为与中和后的行为相同,综合后,这些任务或函数的功能就在引用的一个或多个模块中实现。
综合不支持包中变量声明。仿真时,包中的变量会被导入该变量的所有模块共享。一个模块向量写值,另一模块看到的就将是新值。这类不通过模块端口传递数据的模块间通信是不可综合的。

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

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

相关文章

[学习] FPGA之ip核

>> ip核之概念和分类IP(Intellectual Property)内核模块是一种预先设计好的甚至已经过验证的具有某种确定功能的集成电路、器件或部件。它有几种不同形式。IP内核模块有行为(behavior)、结构(structure&#xff…

常见的机器视觉软件

一、开源的OpenCV 机器视觉我们最常用的软件是OpenCV(Intel OpenSource Computer Vision Library),它的中文论坛http://www.opencv.org.cn/index.php里面有非常清楚的介绍。 二、VisionPro7.0系统,快速开发强大的应用系统 康耐视…

$unit编译单元声明

$unit编译单元声明 SystemVerilog含有编译单元。 相比Verilog,SystemVerilog增加了编译单元的概念。编译单元是同时编译的所有源文件。编译单元为软件工具提供了一种对整个设计子块单独编译的方法。一个子块可能包含第一个或多个模块(module&#xff09…

[学习] FPGA之基本原理(可能理解不对)

>> 什么是fpga FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中 的一种半定制电路而出现的,既解决了定制电路的不足…

忧云:喻红艺术展观后

长征空间。喻红的个展《忧云 wondering clouds》,中文标题似过诗意,而英文可能更准确表达其意图。这幅连体大画至少有15米长,非常壮观,色彩变化,人物的形态,复杂而有序。既有写实也有表现,既有真…

阶乘和

#include <stdio.h>// __int64的范围是 [0, 2^64),即0~18446744073709551615(约1800亿亿) static unsigned __int64 sum_fac(int n);int main(void) {printf("test sum_fac function.\n\n");for(unsigned int k0; k<20; k){printf("k%dth e sum is: %l…

未命名语句块中的声明

未命名语句块中的声明 命名块中的局部变量 Verilog允许在命名的begin…end或fork…join块中声明局部变量。局部变量声明的通常用法是声明一个临时变量进行循环控制。局部变量避免了对同名但用途不同的模块模块级变量的无意访问。下面的代码段声明了两个都叫i的变量&#xff0c…

故乡的路:十位少数民族摄影师联展

故乡的路&#xff1a;10位少数民族摄影师联展。映艺术中心。参展的有蒙古族、维吾尔族、回族、纳西族、傣族、白族、彝族、拉祜族、藏族等。民族是一个视点&#xff0c;故乡也是一个视点&#xff0c;两者的交叉&#xff0c;透过现代化的相机和镜头&#xff0c;获得了一种独特的…

kitl协议包简述

英文版参照网址http://blogs.msdn.com/ce_base/archive/2006/06/27/648747.aspx 下面是翻译过来的&#xff0c;可能有错哦&#xff0c;呵呵 KITL概述 KITL——Kernel Independent Transport Layer&#xff0c;CE驱动调试的基本调试协议。KITL提供 1、 传输初始化 2、 数…

敏捷转型中的看板

Scrumban最初是一种从Scrum向精益看板转换的机制&#xff0c;现在它已经支持双方向的转换&#xff0c;并可以应用到项目和精简BAU(常规商业运营)工作流。能够实施Scrum和精益方法的相互转换自然是很好的。但当你的客户不具备实践这些方法的条件时&#xff0c;你如何去帮助他们实…

GDIPlus灰度化图像

将RGB彩色图像转为8位的索引颜色 先定义一个宏 // Greyscale conversion #define GREY(r, g, b) (BYTE)(((WORD)r * 77 (WORD)g * 150 (WORD)b * 29) >> 8 //#define GREY(r, g, b) (BYTE)(((WORD)r * 169 (WORD)g * 256 (WORD)b * 87) >> 9)// Grayscale, 将…

SystemVerilog文本值和数据类型

SystemVerilog文本值和数据类型 1、增强的文本值赋值 给一个向量赋予文本值 在Veirlog语言中&#xff0c;一个向量可以很容易地赋值为全00、全x&#xff08;不确定&#xff09;或全z&#xff08;高阻态&#xff09;。 parameter SIZE 64; reg [SIZE-1 :0] data; data 0;//…

从IC设计来看Trace32的用途

通常的芯片设计&#xff0c;在开发阶段都会先在一个包含硬IP核的FPGA上进行&#xff0c;通过使用硬件描述语言HDL来对FPGA进行编程&#xff0c;这样既能加快设计速度又能够节省成本&#xff0c;最重要的是可以在芯片开发阶段发现可能存在的HW问题。一般的设计思路是首先将各个外…

使用GDI+保存图像为8bpp的灰度图像

使用GDI保存图像为8bpp的灰度图像&#xff0c;GDI真的有些特殊。。。。。 // Greyscale conversion #define GREY(r, g, b) (BYTE)(((WORD)r * 77 (WORD)g * 150 (WORD)b * 29) >> 8) // .299R .587G .114B //#define GREY(r, g, b) (BYTE)(((WORD)r * 169 (WORD)…

对象类型和数据类型

对象类型和数据类型 Verilog数据类型 Verilog语言具有针对硬件的变量类型和线网类型。这些类型具有特定的仿真和综合语义&#xff0c;表示芯片或系统中的实际连接行为。 &#xff08;1&#xff09;Verilog的reg、integer和time变量的每一位都有四种逻辑&#xff1a;0、1、Z、X…

尺度空间(Scale space)理论

尺度空间方法的基本思想是&#xff1a;在视觉信息处理模型中引入一个被视为尺度的参数&#xff0c;通过连续变化尺度参数获得不同尺度下的视觉处理信息&#xff0c;然后综合这些信息以深入地挖掘图像的本质特征。尺度空间方法将传统的单尺度视觉信息处理技术纳入尺度不断变化的…

[转] Windows CE 6.0 启动过程分析

看到这么好的文章&#xff0c;小郭觉得不转载就是天理不容&#xff0c;转了&#xff01;&#xff01;&#xff01;&#xff01; *************************************************************************************** 在Windows CE 6.0中&#xff0c;内核&#xff08;Ke…

数据类型规则的放宽

数据类型规则的放宽 SystemVreilog放宽了使用变量的限制 SystemVreilog放宽了变量的使用规则&#xff0c;大大简化了模型中数据类型的使用。在SystemVreilog中共&#xff0c;任何数据类型的变量都可以通过下列方式赋值&#xff0c;但只能采用其中的一种方式。 &#xff08;1&a…

真实,让文学回到原点:关于非虚构写作的思考

任何一种文学主张&#xff0c;其实都是先有实践&#xff0c;而后再有理论和命名。“非虚构写作”也是如此。如果大胆猜想&#xff0c;“非虚构写作”可能要追溯到远古的口传心记和结绳记事。当时的人类记录下身边发生的事情&#xff0c;应该就是非虚构&#xff0c;而口头讲述的…

4位16色灰度图像处理

定义几个辅助的宏&#xff0c;如下。 // 拆分合并BYTE #define HIBITS(w) ((BYTE)((((BYTE)(w)) >> 4) & 0xf)) #define LOBITS(w) ((BYTE)(((BYTE)(w)) & 0xf)) #define MAKEBITS(a, b) ((BYTE)(((BYTE)(((BYTE)(a)) & 0xf)) | ((…