1.package 定义及从package中导入定义(***)

verilog中,对于变量、线网、task、function的声明必须在module和endmodule之间。如果task被多个module引用呢?

verilog用include解决,systemverilog借用VHDL的package解决。

@1: package可以包含的可综合的结构有:

1.parameter和localparam常量定义

2.const变量定义

3.typedef 用户自定义类型

4.全自动task和function定义

5.import语句

6.操作符重载定义

eg: package definition;

parameter 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] multipler(input[31:0]a,b);

return a*b;

endfunction

endpackage

@2:package 内容引用方式:

1.使用范围操作符::

module ALU(input definitions::instruction_t IW, input logic clock, output logic [31:0] result);

always_ff @(posedge clock) begin

case (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

2.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_ff @(posedge clock) begin

case (IW.opcode)

ADD: result = IW.a + IW.b;

SUB: result = IW.a – IW.b;

MUL: result = multiplier(IW.a, IW.b);

endcase

end // import definitions::opcodes_t; ?

endmodule

3.import语句通配符导入到模块或接口中

module ALU(input definitions::instruction_t IW, input logic clock, output logic [31:0] result);

import definitions::*;

always_comb begin case (IW.opcode)

ADD: result = IW.a + IW.b;

SUB: result = IW.a – IW.b;

MUL: result = multiplier(IW.a, IW.b);

endcase

end

endmodule

 通配符导入并不自动导入整个package,只是相当于添加了一条搜索路径!!

4.将子项导入$unit中

import definitions :: instruction_t;

module ALU (input instruction_t iw, input logic clock; output logic [31 : 0] result);

package也可以通过通配符导入到$unit域中。通配符导入只是将package加到SystemVerilog源路径中!!

2.$unit编译声明空间

不要在$unit空间进行任何声明,所有共享的声明都要在package中。

需要时,可以将package导入到$unit中。

声明过于分散,结构乱,逻辑差,不利于调试。

3.未命名块中的声明

块命名后可以层次化引用其中变量,但不可以综合。

4.增强的时间单位定义

1. 包含时间单位的时间值:

forever #5ns clock = ~clock; //时间值与单位之间不能有空格!!

2. 使用关键字timeunit和timeprecision:

module adder(input wire[63 : 0] a, b, output reg [63 :0] sum, output reg carry);

timeunit 1ns;

timeprecision 10ps;//是模块的一部分,

……                       //而不是作为软件工具的指令

endmodule

timeunit和timeprecision使模块、接口或程序块与时间单位和精度信息直接绑定,

解决了timescale存在的不确定性和对文件顺序的依赖性。

它必须在其它声明或语句之前,紧随模块、接口或程序的声明之后。

timeunit和timeprecision的声明可以在编译单元域中,但必须在其它声明的前面。

第二章:systemverilog声明的位置的更多相关文章

  1. 【C语言探索之旅】 第一部分第四课第二章:变量的世界之变量声明

    内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布 ...

  2. Laxcus大数据管理系统2.0(5)- 第二章 数据组织

    第二章 数据组织 在数据的组织结构设计上,Laxcus严格遵循数据和数据描述分离的原则,这个理念与关系数据库完全一致.在此基础上,为了保证大规模数据存取和计算的需要,我们设计了大量新的数据处理技术.同 ...

  3. C#本质论读书笔记:第一章 C#概述|第二章 数据类型

    第一章 1.字符串是不可变的:所有string类型的数据,都不可变,也可以说是不可修改的,不能修改变量最初引用的数据,只能对其重新赋值,让其指向内存中的一个新位置. 第二章 2.1 预定义类型或基本类 ...

  4. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  5. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

  6. C++ primer的第二章的主要内容

    这第二章主要是介绍了C++中基本的内置数据类型:整型与浮点型.介绍了什么是变量的过程中了解到了左值与右值的概念.左值是可以出现在赋值语句的左边或者右边,也就是说可以放在等号的左右两边,而右值只能是出现 ...

  7. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  8. 第二章 开始学习C++

    第二章  开始学习C++ 2.1  main函数 简单代码如下: #include <iostream> int main() { //This is my first program u ...

  9. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

随机推荐

  1. NOIp2016 蚯蚓 【二叉堆/答案单调性】By cellur925

    题目传送门 $Sol$ $50pts$:我们考虑$q==0$的情况,每次在所有的蚯蚓中找到一只长度最大的,这非常二叉堆.所以我们可以用一个优先队列,随便水一下就有50分.($NOIp$的分真这么好拿? ...

  2. Django Views and URLconfs

    碧玉妆成一树高,万条垂下绿丝绦. 不知细叶谁裁出,二月春风似剪刀. 原文尽在:http://djangobook.com/ 转载请注明出处:http://www.cnblogs.com/A-FM/p/ ...

  3. 洛谷 P3312 [SDOI2014]数表

    式子化出来是$\sum_{T=1}^m{\lfloor}\frac{n}{T}{\rfloor}{\lfloor}\frac{m}{T}{\rfloor}\sum_{k|T}\mu(\frac{T}{ ...

  4. New Land LightOJ - 1424

    New Land LightOJ - 1424 题意:找出01矩阵中最大的完全由0组成的矩阵. 方法: 重点在于转化. 先预处理(i,j)点向上最长能取到的连续的全0条的长度.然后枚举某一行作为矩阵的 ...

  5. 基于node 搭建http2服务

    1.准备工作:安装node2.安装http2: npm install http2 -g安装完成后,在安装目录中appData/Roaming>npm>node_modules>ht ...

  6. Oozie是什么?

         但是,一般用Azkaban了.(具体见我写的另一篇博客:) 官网:https://oozie.apache.org/ Oozie is a workflow scheduler system ...

  7. ping localhost 返回 ::1的导致不能打开http://localhost的原因及解决

    虽然可以在浏览器中正常访问http://localhost但用file,file_get_contents等函数打开http://localhost异常.用127.0.0.1也可以打开,本地hosts ...

  8. AJPFX总结面向对象(this和super的区别和应用)

    面向对象(this和super的区别和应用)(掌握)* A:this和super都代表什么        * this:代表当前对象的引用,谁来调用我,我就代表谁        * super:代表当 ...

  9. P3371 【模板】单源最短路径

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  10. js数组引用

    总结归纳: 1.普通的赋值是复制栈区内容. 2.基本类型的数据在栈区存放数据自身,var a=b; //a与b无关. 引用类型数据在栈区存放数据地址.  var a=b; //a,b联动 3.基本数据 ...