Verilog
基础结构
module 模块名(参数1,参数2,....)
input 参数1,...
output 参数X,...
endmodule
端口定义输入输出 input,output,inout
默认为wire型变量
其中output可额外设置成为reg型的变量
(reg作用:保存数据)
代码风格
门级 gate
数据流 assign 连续赋值
行为 always,initial
函数
$display 打印
$monitor 监视变量变化打印
$time 时间
$random
编译器指令
`timescale 延迟精度
`include
`define
变量类型
整型
位数 `进制 数
位数没指定则一般为32位及以上
进制为o八 b二 d十 h十六 [不区分大小写]
数可含有 正常数字 x未知 z高阻 [不区分大小写]
符号位有两种情况:
- 在开头,如 -8`d5
- 在进制, 如 `sb1011 这里s表示有符号 [不区分大小写]
字符串
reg[数字1,数字2]
其长度=数字1-数字2+1;
数据类型
wire 线网变量
默认1位
赋值:只能用连续赋值语句assign
reg 寄存器变量
保存最后一次赋值结果
默认一位
赋值:只能always或者initial
其他变量 Integer,time,real,Array
操作符
省略不写
代码
延迟控制#
#具体数字X 表示延迟X个单位时间
事件控制 @(事件控制类型 变量名)
多个控制用or连接
事件控制类型:
可以不写:变量发生变化就会执行语句
posedge:上升沿执行语句
negedge:下降沿执行语句
执行语句
begin #单位时间 end
顺序执行语句
fork #单位时间 end
并行执行语句
过程性赋值
堵塞 =
非堵塞 <=
连续 assign
判断
if else
case endcase
casez z,? 无关位
casex x,z,? 无关位
循环控制
forever 无线循环
repeat 循环指定次数
while for
行为风格代码
intial 立即执行
always
always可用于产生时钟脉冲,如下生成时钟周期为20的波形
always
#10 clock=~clock;
always监听变量变化执行
always @ (变量一 or 变量二 or ...)