FPGA学习笔记语法类

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

功能仿真(前仿真)功能仿真是指在一个设计中,在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程。布局布线以前的仿真都称作功能仿真,它包括综合前仿真(Pre-SynthesisSimulation)和综合后仿真(Post-SynthesisSimulation)。综合前仿真主要针对基于原理框图的设计;综合后仿真既适合原理图设计,也适合基于HDL语言的设计。时序仿真(后仿真)时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,而功能仿真没有。Verilog语法需要注意的一些要点1.Testbench中时钟和数据比特流的简单设计方法alwaysclock=~clock;always@(posedgeclock)begindata_in_a={$radom}%2;//产生-1到1之间随机的比特流data_in_b=16’b1101_1011_1110_0011;//产生固定的比特流$display(“a=%d\n”,a);//与C语言类似end2.Verilog语法中的并行与顺序模块(1)连续赋值语句、always模块之间、实例模块之间都是并行语句(2)always模块内部是分情况而定,对于if…else…而言,总是有优先级的顺序的,对于case而言,无优先级,是完全顺序执行的,此外,还要对阻塞语句和非阻塞语句具体分析。3.Verilog中四种最常见的变量(1)wire,即线网形变量,它不能存储值,必须受到驱动器或者连续赋值语句的驱动,如果没有驱动,那么它将会是高阻态(2)reg是数据存储单元的抽象,通过赋值语句可以改变寄存器存储的值,其作用与改变触发器存储的值相当。寄存器变量的初时值为不确定态。在always内部用到的变量必须是reg型的。(3)prarmeter相当与VHDL中的constant4.注意区分集中容易混淆的运算符(1)位运算符,按位操作,~,|,&,^,其输出与输出一样位宽(2)逻辑运算符,输出0或者1,&&,||,!(3)缩减运算符,按位递归运算,&,|,!,其输出仅仅是1或者05.阻塞语句(blocking)与非阻塞赋值语句(non-blocking)(1)非连续赋值语句(non-blocking)(b=a)在always块结束后才完成赋值操作,并且赋值后b不是立即就改变,在时序逻辑或者既有时序逻辑也有组合逻辑中一定要用这种赋值方式(2)阻塞语句(blocking)(b=a)赋值之后,b就立即改变,也就是在赋值语句完成以后,always才结束,在综合时,如果不注意,将产生意想不到的结果一个非常典型的例子:always@(clock)beginb=a;c=b;endalways@(clock)beginc=b;b=a;endalways@(clock)beginb=a;c=b;end6.使用if或者是case进行综合时,一定要覆盖所有可能的情况,防止锁存器的综合7.写testbench一些常见的保留字$display(“print_word_value=%d”,print_word_value);//与C语言类似$display(“%h,%o”,12’b1101_0100_0111);//结果是0xD47和o6507$monitoron;//监控开始$mointor($time,“rxd=%b”,“txd=%b”,rxd,txd);//打印当前时刻的监控值$monitoroff;$finish;//仿真结束$readmemb(“数据文件名”,存储器名);//把数据读入到当前指定的存储器内rand_data={random}%60;//产生-59到59之间的随机数8.比较下面代码,分别综合出什么,可能出现什么问题moduledff_en(I_en,I_data,I_clock,O_data);inputI_clock;inputI_en;inputI_data;outputO_data;regR_data;assignO_data=R_data;always@(I_clock)beginif(I_en==1)R_data=I_data;endendmodule有以下告警(用synplify综合)(1)Incompletesensitivitylist-assumingcompleteness(2)ReferencedvariableI_enisnotinsensitivitylist(3)ReferencedvariableI_dataisnotinsensitivitylist(4)Latchgeneratedfromalwaysblockforsignal如果改always@(I_clock)为always@(posedgeI_clock)就可以避免,并产生一个带使能的DFF9.下面逻辑有没有问题?moduledff_en(I_reset1,I_reset2,I_data,I_clock,O_data);inputI_clock;inputI_reset1;inputI_reset2;inputI_data;outputO_data;regR_data;assignO_data=R_data;always@(negedgeI_reset1orposedgeI_clock)//敏感变量I_reset2在时钟beginif(I_reset1==0)R_data=0;elseif(I_reset2==0)R_data=1;elseR_data=I_data;endendmodule综合时不会有告警,产生一个带复位和置位的DFF,最好改always@(negedgeI_reset1orposedgeI_clock)为always@(negedgeI_reset1ornegedgeI_reset2orposedgeI_clock)10.逻辑综合结果是什么?modulemux2s1(I_sel,I_a,I_b,O_c,O_d)inputI_sel,I_a,I_b;outputO_c,O_d;regR_c;regR_d;assignO_c=R_c;assignO_d=R_d;always@(I_sel,I_a,I_b)begincase(I_sel)1'b0:R_c=I_a;//综合出latch1'b1:R_d=I_b;//latchendcaseendendmodule该逻辑将产生锁存器。11.下面代码综合结果是什么?moduledff_sys(I_clock,I_data,O_data);inputI_clock,I_data;outputO_data;regR_b,R_c,R_d;always@(posedgeI_clock)beginR_c=R_b;R_b=I_data;R_d=R_c;endendmodulemoduledff_sys(I_clock,I_data,O_data);inputI_clock,I_data;outputO_data;regR_b,R_c,R_d;always@(posedgeI_clock)beginR_c=R_b;R_d=R_c;R_b=I_data;endendmodule两段逻辑都没有任何区别,综合电路如下,这也说明了non-block语句的特点下面逻辑呢?moduledff_sys(I_clock,I_data,O_data);inputI_clock,I_data;outputO_data;regR_b,R_c,R_d;assignO_data=R_d;always@(posedgeI_clock)beginR_b=I_data;R_c=R_b;R_d=R_c;endendmodulemoduledff_sys(I_clock,I_data,O_data);inputI_clock,I_data;outputO_data;regR_b,R_c,R_d;assignO_data=R_d;always@(posedgeI_clock)beginR_b=I_data;R_c=R_b;R_d=R_c;endendmodule12.同一个物理电路的行为仿真验证与结构模块的仿真验证有什么区别?行为仿真是:对电路基本功能验证结构仿真是:对电路的逻辑网表验证

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功