1、模块的端口定义
module 模块名(口1,口2,口3……) 输入和输出端口可以定义在模块定义内
2、功能定义 组合逻辑
①assign
② and or 等元件库名称(以上两种同时执行)
③、always(模块内顺序执行,always间同时执行)
逻辑电路or时序电路 always@(posedge clk or posedge clr) 上升沿触发
4、数据类型
reg
wire
integer
parameter
5、数字
默认十进制 其他进制需定义 x表示不定值 z表示高阻值
负号必须放在最前方
下划线用在具体数字之间
6、参数型
右边是常数表达式,用来定义延迟长度和变量宽度
在一个模块中改变另一个模块的参数时,需要使用defparam命令
7、变量
wire型常用来表示assign连接的组合逻辑信号
reg型 可以改变值,在always块内定义的每一个信号都必须定义为reg型,初始值为不定值。表示操作数时为无符号数,
当一个四位的寄存器用作表达式中的操作数时,如果开始寄存器被赋值-1,则在表达式中进行运算时,其值被当做+15.(四位是16 16-1=15)
8、memory
reg [n-1:0] 存储器名[m-1:0] 表示n个存储器中有m个寄存器(地址范围)
reg [n-1:0] rega;可以直接赋值,rega=0;
reg mema [n-1:0];n个一位寄存器构成的存储器组,不可以直接赋值,需要具体赋值某一位,mema[3]=0,第三个存储单元为0 (取地址)
9、基本运算符
% 求余运算 如果有一个操作数有不定值x,则整个结果也为不定值x
位运算符(~,&,|,^(异或),^~(同或))
不同长度的位运算,右端对齐,高位用0填满
===对不定值和高阻值也进行比较,常用语case表达式,==不比较x和z
移位运算符 <<左移 >>右移 定义的位数也会改变
位拼接运算符
{信号1的某几位,信号2的某几位,…… } 不允许存在没有指明位数的信号
位拼接可以重复使用 {4{w}} wwww
缩减运算符
第一位与第二位进行或与非运算,然后结果与第三位比较 类似 reg [3:0] B;reg C;C=&B;即把B按位依次与运算
10、赋值语句和块语句
always块 如果在给定的条件下变量没有赋值,这个变量将保持原值,也就是说会生成一个锁存器
11、循环语句
forever 产生周期性的波形 用来作为仿真测试信号 必须写在inital块中
repeat 连续执行一个语句n次
12、结构语句
initial 初始化
always 不断重复执行 和一定的时序控制结合在一起 边沿触发or电平触发
任务:
task <任务名>
<端口及数据类型声明语句>
...
endtask
调用: <任务名>(端口1,端口2,...端口n)
function<返回值的类型或范围>(函数名)
<端口说明语句>
<变量类型说明语句>
...
endfunction