|
楼主 |
发表于 2020-6-16 16:25:03
|
显示全部楼层
Verilog
Verilog建模
行为级描述--使用过程化结构建模(always,initial等)
数据流方式--使用连续赋值语句方式建模(assign)
结构化方式--使用门和模块实例语句描述建模
数字系统可以简单归纳为两种元素:线和器件。线是器件管脚之间的物理连线;器件也可简单归纳为组合逻辑器件()如与或非门等和时序逻辑器件(如寄存器、锁存器、RAM等)
一个数字系统(硬件)就是多个器件通过一定的连线关系组合到一块的。因此,Verilog HDL的建模实际上就是如何使用HDL语言对数字电路的两种基本要素的特性及相互之间的关系进行描述的过程。
模块
模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构及与其他模块通信的外部端口。
时延
信号在电路中传输会有传播时延等,如线延时、器件延时。时延就是对时延特性的HDL描述。
coding styl
Verilog HDL的书写格式自由,一行可以写几个语句,也可以一个语句几行写。语句后面要加分号。
书写建议
一个模块用一个文件;
模块名与文件名要同盟;
一行一句语句;
信号方向按输入、输出、双向顺序描述;
设计模块是可尽量考虑采用参数化,提高设计的重用。
基本语法--标识符
用于定义模块名、端口名、信号名等;
可以是任意一组字母、数字、$符号和_(下划线)的组合,但标识符的第一个字符必须是字母或者下划线。
标识符是区分大小写的
关键词保留字不能使用
要有可读性
用有意义的名字:haddr,fifo_wr_en
用下滑线区分词
采用前后缀:clk_*,*_n
采用缩写:rst,addr
参数采用大写:define/paremetel 定义的参数
值集合
四种基本的值:0、1、X、Z
三种常量:整数型、实数型、字符串型(类似C语言)
线网类型:wire
器件之间的连线
assign赋值
没有被驱动时,缺省值为Z
信号没有定义数据类型,缺省值为wire
寄存器类型:reg
通常用于存储单元的描述
always/initial赋值
没有被驱动时,缺省值为X
常数:
参数:parameter WIDTH=2
线网:wire[3:0] data;
寄存器:reg[3:0] cmd;
位选择:data[3],cmd[2]
部分选择:data[3:1]
条件语句
if...else
与begin end 一起使用保证可读性
与always一起使用表示组合逻辑时,if else必须完成,否则会导致形成锁存器。
case...endcase
与begin end 一起使用保证可读性
与always一起使用表示组合逻辑时,default必须写,否则会导致形成锁存器。
……
……
……
常见错误/警告
Multiple driver:同一个变量在不同的always中赋值
Port not declare:没有定义端口
Mix blocking and nonclocking assignment:组合=,时序<=
Object not declared:变量没有定义就被使用
Miss";"漏掉结束符
Miss endmodule
Procedural assignment error:
Continuous assignment error:wire/reg 定义不匹配 所有的input端口都要赋值
Previously declared 多次定义
Too few instance port connections例化时少了一些port
Wire has no fanin/fanout 信号无驱动来源/不驱动任何信号
Width mismatch:信号位宽不匹配
APB Slave Design
ARM研发的AMBA提供一种机制实现RISC处理器与其他IP核和外设的集成,AMBA2.0标准定义了三组总线:
AHM、ASB、APB
AHB、APB最常用
AHB用于高性能、高时钟频率的系统模块
APB用于低速外设
Verilog Test bench
TB也是一个模块(module...endmodule)
Testbench模块没有输入输出
完成对待测设计的例化,测试代码的封装,提供测试激励,收集测试结果
无需综合,行为级描述优先。
变量申明:
给DUT的输入端口灌激励
通过DUT的输出端集响应
提供激励的信号:reg?便于在initial/always中进行赋值
集响应的信号:reg or wire
名称关联例化
时钟产生
forever语句
必须写在initial模块中
//clock generate
initial begin
pclk=0;
forever
#10 pclk=~pclk;
end
Reset 信号 通过延迟控制
reg rst_n;
initial
begin
rst_n=1'b0;
#45;
rst_n=1'b1;
end
仿真控制--电平模式
wait语句
initial
begin
...
wait(rst_n=1'b1);
wait(sim_start);
...
end
仿真控制--事件模式
@(posedge clk)语句;
initial
begin
...
wait(rst_n=1'b1);
wait(sim_start);
@(posedge pclk);
a=1'b1;
...
end
task
task apb_write(input [31:0],input[31:0]wdata);
begin
end
endtask
文件操作
reg [31:0] memory[1023:0];
FILE0=$fopen("block0");
for(address=32'h0;address<32'h80;address=address+1)
$fwritec(FIFL0,memory[addr],"\n");
$fclose(FILE0);
波形处理
//dump waveform
ifdef VPD_ON
initial begin
$vcdpluson();//
end
endif
预编译
ifdef VPD_ON
initial begin
$vcdpluson();
end
endif
define VPD_ON
module apb_slave_tb;
例如:vcs -f rtl.list -f tb.list -timescale=ins/lps -v2005 +v2k -debug_pp +define+VPD_ON\
|
|