在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2461|回复: 1

[原创] 关于验证的前置学习

[复制链接]
发表于 2020-6-16 12:23:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近发的三篇日志莫名其妙地有很多人看,我很高兴各位爸爸能够赏光,但是同时也有不少同学问一些令人匪夷所思地问题。他们给我地感觉就像是哪里赚钱去哪里,感觉什么火就做什么行业。具体可以参考多年前卖保险的、前年的P2P、去年的刷脸支付,今年初被掐死在嫩芽阶段的二手车贷。感觉就是同一帮人。


人贵在有自知之明,而我属于比较贵的那种。所以,我,风渡,一个比较贵的IC行业马桶盖子,希望给那些曾经在互联网金融兴风作浪的臭屎壳子们一句忠告。你们,好好想想自己是否真的玩得过实业大佬,并不是每一个人都是贾老板。你们敢来,我就敢把你们盖住冲进下水道里,以免脏了各位爸爸们的眼睛。


这贴子我主要就发一些我作为初级验证工程师在使用Verilog时的一些实用型的汇总,同时也包括一些萌新关心的问题,笔试考什么,面试面什么之类的。包括但不限于:Verilog语法、经典电路、跨时域分析、有限状态机的写法、实例和代码仿真、FIFO等。

 楼主| 发表于 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\






您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 02:09 , Processed in 0.016110 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表