一个模块必须有输入/输出端口吗?
模块可大可小,大到一个复杂的微处理器系统,小到一个基本的晶体管,都可以作为一个模块来设计。Verilog中,模块(module)是基本的组成单位。建议在一个Verilog文件中,只放一个module定义,而且使文件名称和module名称一致。这是一个良好的设计习惯。
图1 标准module格式
通常module具有输入和输出端口,在module名称后面的括号中列出所有的输入、输出和双向的端口名称。
那么一个模块必须有输入输出端口吗?不一定。有的模块既没有输入端口,也没有输出端口。有的模块只有输入端口,有的模块只有输出端口。
有些module既没有输入端口也没有输出端口。例如,在仿真平台的顶层模块中,其内部已经实例化了所有的设计模块和激励模块,是一个封闭的系统,没有输入和输出。一般这种没有端口的模块都是用于仿真的,不用作实际电路。
有的模块没有输入端口。例如 Tie cell。
图2 Tie cell
有的模块没有输出端口,例如某些power switch。
图3 某种power switch
什么是编译指令?
编译指令(Compiler directive)能够让仿真器和综合工具执行一些特殊的操作。特点:以`(重音符号)为前缀;从处理位置一直保持有效,除非被其他指令覆盖或者取消;`resetall指令将所有编译指令复位成默认值。常用编译指令如下:
⚬`timescale;
⚬`define,`undef;
⚬`ifdef,`else,`endif;
⚬`include;
⚬`resetall。
延伸阅读:
https://www.cnblogs.com/xing-usetc/p/16585290.html
Verilog有哪些变量类型?
在Verilog语言中,有两大变量类型:
⚬ 线网型:表示电路间的物理连线。
⚬ 寄存器型:Verilog中的一个抽象的存储数据单元。
① 凡是在always或initial语句中赋值的变量,一定是寄存器变量;
② 在assign中赋值的一定是线网变量。在线网类型下,分为几种子类,它们具有线网的共性:
⚬ wire、tri: 表示电路间连线,tri主要用于多驱动源建模;
⚬ wor、trior: 表示该连线具有“线或”功能;
⚬ wand、triand: 表示该连线具有“线与”功能;
⚬trireg: 表示该连线具有总线保持功能;
⚬tri1、tri0: 表示当无驱动时,连线状态为1(tri1)和0(tri0);
⚬supply1、supply0:分别表示电源和地信号。
在以上描述的线网类型中,除了trireg未初始化时为“X”以外,其余的未初始化时的值为“Z”。
线网类型主要用在连续赋值语句中,以及作为模块之间的互连信号。
寄存器类型变量在Verilog语言中通常表示一个存储数据的空间。尤其是在Verilog仿真器中,寄存器类型变量通常占据一个仿真内存空间。
⚬reg: 是最常用的寄存器类型数据,可以是1位或者多位,或者是二维数组(存储器);
⚬integer: 整型数据,存储一个至少32位的整数;
⚬time: 时间类型,存储一个至少64位的时间值;
⚬real,realtime: 实数和实数。
寄存器类型变量是否就对应于硬件电路中的寄存器?
“线网”变量可以理解为电路模块中的连线,但“寄存器”变量并不严格对应于电路上的存储单元,包括触发器(flip-flop)或锁存器(latch)。从纯粹语言表达的语义角度来说,寄存器类型变量的值,从一个赋值到下一个赋值被保存下来,并且在仿真过程中会保持而不会丢失。
Verilog的3种描述方式是什么?
我们使用HDL代码描述硬件功能的时候,主要有三种基本描述方式,即结构化描述方式、数据流描述方式和行为级描述方式。
结构化描述的抽象级别最低,是最接近实际硬件结构的描述方式。直接采用结构化描述语句描述,需要描述实现功能所需数字电路的逻辑关系,及其复杂;结构化描述语句常用于层次化模块间的调用、以及ip核的例化等。
数据流描述是使用连续赋值语句(assign)对电路的逻辑功能进行描述,该方式特别便于对组合逻辑电路建模。
行为级描述方式是使用过程块语句结构(always)和比较抽象的高级程序语句对电路的逻辑功能进行描述。