1、片上系统(SOC)设计,主讲:张儒2018年10月18日,目 录,SOC设计概述可编程逻辑器件 硬件描述语言及其程序设计方法 SOC的设计基本工具和方法SOC设计实例,Verilog HDL 简介,Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。 Verilog HDL语言具有下述描述能力: 设计的行为特性 设计的数据流特性 设计的结构组成 包含响应监控和设计验证方面的时延和波形产生机制。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证
2、。,Verilog HDL 简介,Verilog HDL硬件描述语言的主要能力: 基本逻辑门,例如and、or和nand等都内置在语言中。 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。 开关级基本结构模型,例如pmos和nmos等也被内置在语言中。 提供显式语言结构指定设计中端口到端口的时延及路径时延和设计的时序检查。 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式使用过程化结构建模;数据流方式使用连续赋值语句方式建模;结构化方式使用门和模块实例语句描述建模。,Verilog HDL 简介,Verilog HDL硬件描述语言
3、的主要能力(续): Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。 能够描述层次设计,可使用模块实例结构描述任何层次。 设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。 Verilog HDL不再是某些公司的专有语言而是IEEE标准。 人和机器都可以阅读Verilog语言,因此它可以作为EDA的工具和设计者之间的交互语言。,Verilog HDL 简介,Verilog HDL硬件描述语言的主要能力(续): Verilog HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展
4、。PLI是允许外部函数访问Verilog模块内信息、允许设计者与模拟器交互的例程集合。 设计能够在多个层次上加以描述,从开关级、门级、寄存器传输级(RTL)到算法级,包括进程和队列级。 能够使用内置开关级原语在开关级对设计完整建模。 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。 Verilog HDL能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。,Verilog HDL 简介,Verilog HDL硬件描述语言的主要能力(续): 在行为级描述中,Verilog HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行
5、设计描述。 能够使用门和模块实例化语句在结构级进行结构描述。 Verilog HDL还具有内置逻辑函数,例如&(按位与)和 | (按位或)。 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。 可以显式地对并发和定时进行建模。 提供强有力的文件读写能力。 语言在特定情况下是非确定的,即在不同的模拟器上模型可以产生不同的结果;例如,事件队列上的事件顺序在标准中没有定义。,Verilog程序的结构,模块是Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。 一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为
6、使用连续赋值语句进行描述; 时序行为使用过程结构描述。 一个模块可以在另一个模块中使用。,Verilog程序的结构,Verilog程序由关键词module和endmodule进行定义 Verilog HDL 大小写敏感,Verilog程序的组成部分,这5个组件的排列顺序是任意的,可以选择其中的一个或几个组件构成一个Verilog程序。,时延,Verilog HDL模型中的所有时延都根据单位定义。 下面是带时延的连续赋值语句实例:assign #2 Sum = A B;#2指2个时间单位。 如果没有说明时延时间单位,Verilog HDL模拟器会指定一个缺省时间单位。 IEEE Verilog
7、HDL标准中没有规定缺省时间单位。,数据流描述,一般使用连续赋值assign语句描述,主要用于组合逻辑电路建模。,module mux2_1(out1, a, b, sel) ;output out1;input a, b;input sel;assign out1=(sel endmodule,module mux2_1(out1, a, b, sel) ;output out1;input a, b;input sel;assign out1= sel ? b : a;endmodule,行为描述,一般使用Initial或Always语句描述,可以对组合、时序逻辑电路建模。,module
8、mux2_1(out1, a, b, sel) ;output out1;input a, b;input sel; always (sel or a or b) begincase (sel)1b0 : out1 = a;1b1 : out1 = b;endcase end endmodule,module mux2_1(out1, a, b, sel) ;output out1;input a, b;input sel; always (sel or a or b) beginif (sel) out1 = b;elseout1 = a; end endmodule,结构描述,一般使用内部
9、元件(Primitive)、自定义的下层模块对电路进行描述。主要用于层次化设计中。,module mux2_1(out1,a,b,sel);output out1;input a,b,sel; not (sel_, sel); and (a1, a, sel_); and (b1, b, sel_); or (out1, a1, b1);endmodule,混合设计描述,结构和行为描述方式可以自由混合。模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及a l w a y s语句和i n i t i a l语句的混合。它们之间可以相互包含。来自a l w a y s语句和i n i
10、t i a l语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关。而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发a l w a y s语句和i n i t i a l语句。,混合设计描述,实例:混合设计方式的1位全加器,module FA_Mix(A,B,Cin,Sum,Cout);input A,B,Cin;output Sum,Cout;reg Cout;reg T1,T2,T3;wire S1; xor X1(S1,A,B); /门实例语句 always (A or B or Cin) /always 语句 beginT1 = A /连续赋值语句 e
11、ndmodule,Verilog 基础知识,间隔符:空格、TAB键、换行符及换页符 注释 单行注释用/标志起头和回车符结尾 多行注释用/*标志起头和*/标志结尾 标识符 可以是任意一组字母、数字、$符号和_(下划线)符号的组合; 必须是由字母或下划线开头,长度小于1024字符; 转义标识符以反斜杠“”开头,以空白符结尾的任何字符序列; 标识符区分大、小写。 关键词:Verilog HDL 内部已使用的词,关键词都是小写。 格式:区分大小写。自由格式,即结构可以跨越多行编写。,Verilog 基础知识,系统任务和函数 以$字符开始的标识符表示系统任务或系统函数; 任务提供了一种封装行为的机制,任
12、务可以返回0个或多个值; 函数除只能返回一个值以外与任务相同; 函数在0时刻执行,即不允许延迟,而任务可以带有延迟。 编译指令:以(反引号)开始的某些标识符 define和undef,ifdef、else和 endif,default_nettype include,resetall,timescale unconneted_drive和nounconnected_drive celldefine和endcelldefine,Verilog 基础知识,四种基本的值 0:逻辑0或“假” 1:逻辑1或“真” x:未知 z:高阻 三类常量 整型数:简单的十进制格式,基数格式(5O37,4B1x_01
13、) 实数:十进制计数法,科学计数法 字符串:字符串是双引号的字符序列,字符串不能分成多行书写 参数 参数是一个常量,经常用于定义时延和变量的宽度。,Verilog 基础知识,数据类型 线网类型。net type表示Verilog结构化元件间的物理连线。它的值由驱动元件的值决定;如果没有驱动元件连接到线网,线网的缺省值为z。寄存器类型。register type表示一个抽象的数据存储单元,它只能在always语句和initial语句中被赋值,并且它的值从一个赋值到另一个赋值被保存下来。寄存器类型的变量具有x的缺省值。,Verilog 基础知识,Nets数据类型:表示元件之间的结构化连接 wire
14、和tri线网:是最常见的线网类型。 wor和trior线网:如果某个驱动源为1,那么线网的值也为1。 wand和triand线网:如果某个驱动源为0,那么线网的值为0。 trireg线网:此线网存储数值(类似于寄存器),并且用于电容节点的建模。 tri0和tri1线网:这类线网可用于线逻辑的建模,即线网有多于一个驱动源。 supply0和supply1线网:supply0用于对“地”建模,即低电平0;supply1用于对电源建模,即高电平1。,Verilog 基础知识,Register数据类型:在程序块中作变量用,对信号赋值需要用该数据类型,赋值时用关键字initial或always开始。 r
15、eg寄存器类型:是最常见的数据类型. integer寄存器类型:整数寄存器包含整数值,可以作为普通寄存器使用,典型应用为高层次行为建模。 time类型:用于存储和处理时间。 real和realtime类型:实数寄存器(或实数时间寄存器)。,Verilog 表达式,操作数 常数,参数,线网,寄存器,位选择,部分选择,存储器单元,函数调用。 标量线网:线宽只有一条的连线,位数只有一位的寄存器。 向量线网:线宽大于一条的连线,位数大于一位的寄存器。 向量线网可选用关键词scalared或vectored定义。如果一个线网定义时使用了关键词vectored,那么就不允许位选择和部分选择该线网。换句话说
16、,必须对线网整体赋值。 存储器的表示(Memory):存储器是一个寄存器数组。 宏文本替换(define):define指令用于文本替换,它很像C语言中的#define 指令,如:define MAX_BUS_SIZE 32,Verilog 表达式,运算符(9类) 算术运算符: +、-、*、/、% 位运算符: 、&、|、 缩位运算符(单目): &、&、|、|、 逻辑运算符: !、&、| 关系运算符(双目): 、= 相等与全等运算符: =、!=、=、!= 逻辑移位运算符: 连接运算符: 条件运算符: ?:,门电平模型化,在Verilog HDL语言中已预定义了门级原型,and n-input A
17、ND gatenand n-input NAND bateor n-input OR gatenor n-input NOR gatexor n-input exclusiveOR gatexnor n-input exclusiveNOR gate,buf n-output buffernot n-output inverterbufif0 tri-state buffer;Io enablebufif1 tri-state buffer;hi enablenotif0 tri-state inverter;Io enablenotif1 tri-state inverter;hi enab
18、le,门电平模型化,在Verilog HDL语言中已预定义了单向和双向的晶体管级原型,Pmos uni-directionalPMOS switchrpmos resistivePMOS switchnmos uni-directionalNMOS switchrnmos resistiveNMOS switchcmos uni-directionalCMOS switchrcmos resistiveCMOS switchpullup pullup resistor,tran bi-directional passtransistorrtran resistive passtransisto
19、rtranif0 bi-directionaltrnasistor;Io enablertranif resistive transitor;Io enabletranif1 bi-directionaltransistor;hi enablertranif1 resistive transistor;hi enablepulldow pulldown resistor,用户定义的原语,UDP的定义,primitive UDP_name (OutputName, List_of_inputs)Output_declarationList_of_input_declarationsReg_dec
20、larationInitial_statementtableList_of_tabel_entriesendtable endprimitive,用户定义的原语,在组合电路UDP中,表规定了不同的输入组合和相对应的输出值。 在时序电路UDP中,使用1位寄存器描述内部状态。该寄存器的值是时序电路UDP的输出值。共有两种不同类型的时序 电路UDP: 模拟电平触发行为 模拟边沿触发行为 时序电路UDP使用寄存器当前值和输入值决定寄存器的下一状态(和后继的输出)。,Verilog 程序设计,if-else 条件语句case 语句for循环语句,if (条件表达式) 块语句1 else if (条件表达
21、式2) 块语句2 else if (条件表达式n) 块语句n else 块语句n+1,case (敏感表达式)值1: 块语句1值2: 块语句2值n: 块语句ndefault:块语句n+1 endcase,for (表达式1;表达式2;表达式3)块语句,Verilog 程序设计,赋值语句阻塞型过程赋值 赋值算符“” :前一条语句没有完成赋值过程之前,后面的语句不可能被执行。 非阻塞型过程赋值 赋值算符“” :一条非阻塞型赋值语句的执行,并不会影响块中其它语句的执行。 连续赋值语句 只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值结果。用关键词assign来区分。,基本形式:; 外部模式:
22、 ; 内部模式: ; 定时控制分为两类:延时控制事件控制 (事件控制敏感表),Verilog 程序设计,任务(task) 函数(function) 任务和函数结构之间的差异: 一个任务块可以含有时间控制结构,而函数块则没有; 一个任务块可以有输入和输出,而函数块必须有至少一个输入,没有任何输出; 任务块的引发是通过一条语句,而函数块只有当它被引用在一个表达式中时才会生效。,task 任务名;端口与类型说明;局部变量说明;块语句 endtask,function 函数名;输入端口与类型说明;局部变量说明;块语句 endfunction,Verilog 程序设计,时序控制 由“#”符号引入的延迟控
23、制。它将程序的执行过程中断一定的时间,时间的长度由的值来确定。由“”符号引入的事件控制。一个事件可以通过运行表达式“- event”变量被激发。等待语句。直到表达式计算为真之前,都延时下一个语句的执行。延迟定义块。对模块中某一指定的路径进行延迟定义,这一路径连接模块的输入端口与输出端口(或双向端口)。, ;, (| ) ;,wait () ;,specify() = endspecify,设计验证与仿真,Verilog HDL不仅提供描述设计的能力,而且提供对激励、控制、存储响应和设计验证的建模能力。 激励和控制可用初始化语句产生。验证运行过程中的响应可以作为“变化时保存”或作为选通的数据存储
24、。 最后,设计验证可以通过在初始化语句中写入相应的语句自动与期望的响应值比较完成。 要测试一个设计块是否正确,就要用Verilog再写一个测试模块。这个测试模块应包括以下三个方面的内容: 测试模块中要调用到设计块,只有这样才能对它进行测试; 测试模块中应包含测试的激励信号源; 测试模块能够实施对输出信号的检测,并报告检测结果。,设计验证与仿真,实例:时序检测器时序检测器用于检测数据线上连续三个1的序列,其状态图如下图所示,在时钟的每个下降沿检查数据。,设计验证与仿真,实例:时序检测器,module Count3_ls(Data, Clock, Detect3_ls);input Data, C
25、lock;output Detect3_ls;integer Count;reg Count;reg Detect3_ls; initialbeginCount = 0;Detect3_ls = 0;end; always (negedge Clock)beginif (Data = 1)Count = Count + 1;elseCount = 0;if (Count = 3)Detect3_ls = 1;elseDetect3_ls = 0;end endmodule,module Top;reg Data, Clock;integer Out_File;/ 待测试模块的应用实例Count
26、3_ls F1 (Data, Clock, Detect); initialbeginClock = 0;forever #5 Clock = Clock;end initialbeginData = 0;#5 Data = 1;#40 Data = 0;#10 Data = 1;#40 Data = 0;#20 $stop; /模拟结束end initialbegin/在文件中保存监控信息Out_File = $fopen(“results.vectors”);$fmonitor(Out_File, “Clock=%b, Data=%b,Detect=%b”, Clock, Data, Detect);end endmodule,