Introduction to Verilog ACM 11’ 陈爽 2012.7.25
History Creator: Phil Moorby -> GateWay Design Automation Time: 1983 Publication: 1990 by Cadence IEEE standard of Verilog HDL, 1995 First modern HDL
Key Words EDA HDL C语言 结构化 过程化
Hello World Module main; initial begin $display(“Hello world!”); $finish; end endmodule
Content 模块 数据类型 语句 预处理&编译 抽象级别 与C比较
模块的结构 模块Block:Verilog的基本设计单元(类比函数) module block(a,b,c,d) Input a,b; Output c,d; Assign c=a|b; Assign d=a&b; endmodule
模块内容 I/O说明 内部信号说明 功能定义 Input 端口名1,端口名2… Output 端口名1,端口名2… 变量定义&说明 assign声明 用实例元件 and and_test(q,a,b) 调用与门 用always块
Attention E.g.异步清除端的D触发器 Always @(posedge clk or posedge clr) Begin If (clr) q<=0; Else if (en) q<=d End 3种功能地位相等,同时执行。Always内部顺序执行
数据类型 共19种 数字 <位宽><进制><数字> 8’b10101100, 位宽为8的二进制 x值(不定)和z值(高阻);负数;下划线(用来隔开数) 常量parameter Parameter e=25,f=5.7; Parameter ave=(e+f)/2; 常数表达式
常量 一个模块中改另一个模块中的参数要用defparam
数据类型 变量 Wire [n-1:0] 数据名1,数据名2… 数据名i Reg [n-1:0],寄存器储存 // i条总线,每条总线内有n条线路 E.g. wire[7:0] b; 定义了一个八位的wire型数据 输入输出信号的缺省类型,以assign制定的组合逻辑信号 Reg [n-1:0],寄存器储存 Memory型:数组(verilog里没有多维数组) Reg[7:0] memo[255:0] 一个拥有256个8位寄存器变量的存储器
运算符 基本的算术运算符 位运算符 逻辑运算符 关系运算符 等式运算符 移位运算符 位拼接运算符 缩减运算符
位拼接运算符 {信号1的某几位,信号2的某几位…} {a, b[3:0], w, 3’b101} 还可用重复法简化 {4{w}}={w,w,w,w} 加法器中wire[3:0] a,b; {jin,sum}=a+b;
赋值语句 非阻塞Non Blocking赋值 <= 阻塞赋值 = Begin Begin Begin q3=q2; q1<=d; end 时序和混合逻辑用非阻塞;组合逻辑用阻塞 Begin q3=q2; q2=q1; q1=d; end Begin q1<=d; q2<=q1; q3<=q2; end
块语句 顺序块:语句依次执行 并行块:块内语句同时执行 fork 语句1; 语句2; … 语句n; Join Attention:块和语句的起始时间和结束时间
Parameter d=50; Reg[7:0] r; Begin Fork #250 -> end_wave; #d r=‘h35; #d r=‘hE2; #d r=‘h00; #d r=‘hF7; #d -> end_wave; end Fork #250 -> end_wave; #50 r=‘h35; #100 r=‘hE2; #150 r=‘h00; #200 r=‘hF7; end
结构说明语句 Initial说明语句(多个并行) VS main() Always语句 Function:必须要有输入,通过返回响应输入 不断执行 Always #half_period areg=~areg; Function:必须要有输入,通过返回响应输入 Task:多种目的,可调用其他task或function
Verilog里可在块内定义局部变量 所有变量都静态存储
预处理&编译 `define:宏名代替字符串,不作语法检查 `include:将库的内容全部复制进来 可以出现在Verilog HDL源程序的任何地方 `timescale <时间单位>/<时间精度> #d 由时间单位和时间精度来决定 E.g. `timescale <2s>/<1ms> #3.002 真实延迟时间为6.001s
抽象级别 系统级 算法级 RTL级 Register Transfer Level 门级 开关级
门级结构
Difference between Verilog&C Blocking,Non Blocking 顺序块&并行块 块与块之间并行执行 task&function 独特的系统函数 $monitor,$stop
C VS Verilog C Language: 灵活,查错功能强,语法完备,缺陷较少 Verilog:在一些方面(e.g. 算法表达)方面不方便 利用C的完整性和Verilog对硬件描述的精确性……
互相配合 C Language:算法的描述和验证 Verilog:设计专门的电路来进行对速度有要求的实时数据处理,从电路结构上保证算法能在规定时间内完成
Reference 《Verilog经典教程》by 夏宇闻 Wikipedia
Questions are welcome~ 2012.7.25 THANK YOU Questions are welcome~ 2012.7.25