第二章:systemverilog声明的位置

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的声明可以在编译单元域中,但必须在其它声明的前面。

时间: 2024-09-29 23:58:40

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

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

内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算符 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理

《linux内核设计与实现》第二章

第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 下载代码后,更新分支到Linux的最新分支: $ git pull 这两个命令可以获取并随时保持与内核官方的代码树一致. 2.安装内核源代码 压缩形式是bzip2,则运行: $ tar xvjf linu

【深度探索C++对象模型】第二章 构造函数语意学(上)

第二章 构造函数语意学(The Semantics of Constructors) -- 本书作者:Stanley B.Lippman 一.前言 首先让我们来梳理一个概念: 默认构造函数(Default Constructor) : 是在没有显示提供初始化式时调用的构造函数.它由不带任何参数的构造函数,或是为所有形参提供默认实参的构造函数定义.如果定义的某个类的成员变量没有提供显示的初始化式时,就会调用默认构造函数(Default Contructor). 如果用户的类里面,没有显示的定义任何

第二章 开始学习C++

第二章  开始学习C++ 2.1  main函数 简单代码如下: #include <iostream> int main() { //This is my first program using namespace std; cout << "Hello C++!" << endl; return 0; } C++中所有的语句都以分号(;)结束.return 0;叫做返回语句. 2.1.1  作为接口的函数头 函数头描述了函数与调用它的函数的接口.

第二章 图像的显示

声明:这一章开始的代码都是本人实际演示过的,按照本人的操作可以运行.程序并没有很强的健壮性,只能对正确的操作做出符合预期的响应. 整本书的代码文件.测试图片和程序运行exe请在这里下载:https://github.com/CaptainLYN/VCPictureProcessing 由于这本书我已经做完很长时间了,对于文章中的文字的重点现在已是不甚记得了,所以在此为了避免误导,只贴出代码,代码中大都有我写这个代码时候的心得,基本上都是书中的代码,很多地方都有写注释哦~相对于(错误百出的)原书有

《程序员的自我修养》 第二章——编译和链接

摘自http://blog.chinaunix.net/uid-26548237-id-3839979.html <程序员的自我修养>第二章——编译和链接 2.1 被隐藏了的过程    C语句的经典,“Hello World”程序几乎是每个程序员闭着眼睛都能写出的,编译运行一气呵成,基本成了程序入门和开发环境测试的默认标准. #include <stdio.h> int main() { printf("Hello World\n"); return 0; 在L

第二章 数学运算、数组、文字处理

第二章 数学运算.数组.文字处理.md 知识要点 数学运算 数组的使用 seq tr sort uniq cut 等命令 数学运算 整数运算 常用的运算符 加法运算符:+ 减法运算符:- 乘法运算符:/ 求模运算符:% 求幂运算符:** 常用整数运算 第一种 declare -i a=10*20; echo $a 少用 第二种 a=$(expr 10'*'20); echo $a 少用 第三种 a=$[10*2]; echo $a []中的变量无需加$ echo $[RANDOM%10] 求0-

【C Primer Plus笔记】第二章 C语言概述

第二章主要通过分析一个简单的实例来介绍C语言. 一.程序细节内容 1 #include <stdio.h> 此语句的作用相当于在文件中该行所在的位置键入了文件stdio.h的完整内容.实际上是一种剪切和粘贴操作. #include语句是C预处理器指令(preprocessor directive)的一个例子.stdio.h文件作为所有C编译包的一部分提供,它包含了有关输入和输出函数的信息供编译器使用.这个名字代表标准输入输出头文件. 最重要的是头文件中包含了建立最终可执行程序时编译器需要用到的

go语言总结第二章

var和const :变量和常量的声明 var varName type 或者 varName : = value package and import: 导入 func: 用于定义函数和方法 return :用于从函数返回 defer someCode :在函数退出之前执行 go : 用于并行 select 用于选择不同类型的通讯 interface 用于定义接口 struct 用于定义抽象数据类型 break.case.continue.for.fallthrough.else.if.swi