芯片设计:verilog断言(SVA)语法

芯片设计:verilog断言(SVA)语法
芯片设计:verilog断言(SVA)语法

芯片设计:verilog断言(SVA)语法

(2014-01-23 13:51:36)

转载▼

标签:

verilog

sva

assertion

断言

it

作者:白栎旸

断言assertion被放在verilog设计中,方便在仿真时查看异常情况。当异常出现时,断言会报警。一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于30%。以下是断言的语法:

1. SVA的插入位置:在一个.v文件中:

module ABC ();

rtl代码

SVA断言

endmodule

注意:不要将SVA写在enmodule外面。

2. 断言编写的一般格式是:

【例】断言名称1:assert property(事件1) //没有分号

$display("........",$time); //有分号

else

$display("........",$time); //有分号

断言名称2:assert property(事件2)

$display("........",$time);

else

$display("........",$time);

断言的目的是:断定“事件1”和“事件2”会发生,如果发生了,就记录为pass,如果没发生,就记录为fail。注意:上例中没有if,只有else,断言本身就充当if的作用。

上例中,事件1和事件2可以用两种方式来写:

(1) 序列块: sequence name;

。。。。。。。。。;

endsequence

(2) 属性块:property name;

。。。。。。。。。;

endsequence

从定义来讲,sequence块用于定义一个事件(砖),而property块用于将事件组织起来,形成更复杂的一个过程(楼)。sequence块的内容不能为空,你写乱字符都行,但不能什么都没有。sequence也可以包含另一个sequence, 如:

sequence s1;

s2(a,b);

endsequence //s1和s2都是sequence块

sequence块和property块都有name,使用assert调用时都是:“assert property(name);”

在SVA中,sequence块一般用来定义组合逻辑断言,而property一般用来定义一个有时间观念的断言,它会常常调用sequence,一些时序操作如“|->”只能用于property就是这个原因。

注:以下介绍的SVA语法,既可以写在sequence中,也可以写在property中,语法是通用的。

3. 带参数的property、带参数的sequence

property也可以带参数,参数可以是事件或信号,调用时写成:assert property (p1(a,b))

被主sequence调用的从sequence也能带参数,例如从sequence名字叫s2,主sequence名字叫s1:

sequence s1;

s2(a,b);

endsequence

4. property内部可以定义局部变量,像正常的程序一样。

property p1;

intcnt;

.....................

endproperty

【注】在介绍语法之前,先强调写断言的一般格式:

一般,断言是基于时序逻辑的,单纯进行组合逻辑的断言很少见,因为太费内存(时序逻辑是每个时钟周期判断一次,而组合逻辑却是每个时钟周期内判断多次,内存吃不消)。因此,写断言的一般规则是:time + event,要断定发生什么event,首先要指定发生event 的时间,例如

每个时钟上升沿+ 发生某事

某信号下降时+ 发生某事

5. 语法1:信号(或事件)间的“组合逻辑”关系:

(1) 常见的有:&&, ||, !, ^

(2) a和b哪个成立都行,但如果都成立,就认为是a成立:firstmatch(a||b),与“||”基本相同,不同点是当a和b都成立时,认为a成立。

(3) a ? b:c ———— a事件成功后,触发b,a不成功则触发c

6. 语法2:在“时序逻辑”中判断独立的一根信号的行为:

@ (posedgeclk) A事件; ————当clk上升沿时,如果发生A事件,断言将报警。

边沿触发内置函数:(假设存在一个信号a)

$rose( a );————信号上升

$fell( a );————信号下降

$stable( a );————信号值不变

7. 语法3:在“时序逻辑”中判断多个事件/信号的行为关系:

(1) intersect(a,b)————断定a和b两个事件同时产生,且同时结束。

(2) a within b ————断定b事件发生的时间段里包含a事件发生的时间段。

(3) a ##2 b ————断定a事件发生后2个单位时间内b事件一定会发生。

a ##[1:3]

b ————断定a事件发生后1~3个单位时间内b事件一定会发生。

a ##[3:$]

b ————断定a事件发生后3个周期时间后b事件一定会发生。

(4) c throughout (a ##2 b) ————断定在a事件成立到b事件成立的过程中,c事件“一直”成立。

(5) @ (posedgeclk) a |-> b ————断定clk上升沿后,a事件“开始发生”,同时,b事件发生。

(6) @ (posedgeclk) a.end |-> b ————断定clk上升沿后,a事件执行了一段时间“结束”后,同时,b事件发生。

注:"a |-> b" 在逻辑上是一个判断句式,即:

if a

b;

else

succeed;

因此,一旦a 发生,b 必须发生,断言才成功。如果a没发生,走else,同样成功。

(7) @ (posedgeclk) a |=> b ————断定clk上升沿后,a事件开始发生,下一个时钟沿后,b事件开始发生。

(8) @ (posedgeclk) a |=>##2b ————断定clk上升沿后,a事件开始发生,下三个时钟沿后,b事件开始发生。

(9) @ (posedgeclk) $past(a,2) == 1'b1 ————断定a信号在2个时钟周期“以前”,其电平值是1。

(10) @ (posedgeclk) a [*3] ————断定“@ (posedgeclk) a”在连续3个时钟周期内都成立。 @ (posedgeclk) a [*1:3] ————断定“@ (posedgeclk) a”在连续1~3个时钟周期内都成立。

@ (posedgeclk) a [->3] ————断定“@ (posedgeclk) a”在非连续的3个时钟周期内都成立。

举一个复杂点的例子:

property ABC;

inttmp;

@(posedgeclk) ($rose(a),tmp = b) |-> ##4 (c == (tmp*tmp+1)) ##3 d[*3];

endproperty

上例的一个property说明:当clk上升沿时,断言开始。首先断定信号a由低变高,将此时的信号b的值赋给变量tmp,4个时钟周期后,断定信号c的值是4个周期前b^2+1,再过3个周期,断定信号d一定会起来,再过3个周期,信号d又起来一次。。。。。。。只有这些断定都成功,该句断言成功。otherwise,信号a从一开始就没起来,则断言也成功。

8. 语法4:多时钟域联合断言:一句断言可以表示多个时钟域的信号关系,例如:

@ (posedge clk1)a |-> ##1 @ (posedge clk2) b

当clk1上升沿时,事件a发生,紧接着如果过来第二个时钟clk2的上升沿,则b发生。“##1”在跨时钟时不表示一个时钟周期,只表示等待最近的一个跨时钟事件。所以此处不能写成##2或其他。但是可以写成:

@ (posedge clk1)a |=> @ (posedge clk2) b

9. 语法5:总线的断言函数

总线就是好多根bit线,共同表示一个数。SVA提供了多bit状态一起判断的函数,即总线断言函数:

(1) $onehot(BUS) ————BUS中有且仅有1 bit是高,其他是低。

(2) $onehot0(BUS) ————BUS中有不超过1 bit是高,也允许全0。

(3) $isunknown(BUS) ————BUS中存在高阻态或未知态。

(4) countones(BUS)==n ————BUS中有且仅有n bits是高,其他是低。

10. 语法6:屏蔽不定态

当信号被断言时,如果信号是未复位的不定态,不管怎么断言,都会报告:“断言失败”,为了在不定态不报告问题,在断言时可以屏蔽。

如:@(posedgeclk) (q == $past(d)),当未复位时报错,屏蔽方法是将该句改写为:

@(posedgeclk) disable iff (!rst_n) (q == $past(d)) //rst是低电平有效

10. 语法6:断言覆盖率检测:

name: cover property (func_name)

11. 在modelsim中开启断言编译和显示功能:

(1)【编译verilog代码时按照system verilog进行编译】 vlog -svabc.v

(2)【仿真命令加一个-assertdebug】 vsim -assertdebug -novopttestbench

(3)【如果想看断言成功与否的分析,使用打开断言窗口的命令】view assertions

12. 在VCS中加入断言编译和显示功能:

在fsdb文件中加一句话:$fsdbDumpSVA

在VCS编译参数:system "vcs $VCS_SIMULATION" 中加入一些options:

-assert enable_diag\

-assert vpiSeqBeginTime\

-assert vpiSeqFail\

-assert report=路径\

-assert finish_maxfail=100

******************************************************************************* ****************

【经验】以下是一些编写断言的经验:

1. 断言的目的:传统的验证方法是通过加激励,观察输出。这种方法对案例的依赖严重,案例设计不好,问题不便于暴露。而断言是伴随RTL代码的,不依赖测试案例,而是相对“静态”。例如:我们要测试一个串行数据读写单元,数据线只有一根,先传四位地址,再传数据。

(1)案例验证法:写一个地址,再写一段数据,然后读取该地址,看输出的是不是刚才写的数据。

(2)断言法:不需要专门设计地址和数据,当发起写时,在地址传输的时间里将地址存储到一个变量里,在数据传输的时间里将数据存储到一个变量里,观察RAM中该地址是否存在该数据就可以了。

断言设计相当于在电脑上把RTL实现的功能再实现一遍。

2.断言中可以包含function和task。而且function经常用于断言,因为有的处理很复杂,而断言又是“一句式”的,无法分成好几句进行表达,所以需要function替断言分担工作。

3. 断言允许规定同时发生的事件,就是组合逻辑,你可以写成:a && b,也可以写成a ##0 b,不能写##0.5,不支持小数。

4. 断言是用电脑模仿RTL的运行过程,当RTL功能复杂时,你必须用到变量。断言中支持C语言的int和数组声明,但在赋值时“不能”写成:##4 var = Signal,其中var是断言中的变量,和RTL无关,Signal是RTL中的一个信号。本句是想在第4周期将Signal的值赋给var,以便在后面使用该值。但本句只有变量赋值,没有对RTL信号的任何断言,就会报错,解决方法是:##4 (“废话”,var = Signal),一定要有断言的话我们就写“废话”,例如:data == data 等。如果有多个变量要赋值也可以,##4 (废话,变量1赋值,变量2赋值...........)

5. 关于断言的表达风格:语法介绍的“a |-> b”,实际上是“if a, then b”的逻辑,当a不发生,b也不会被判断,该断言自然成功。但当我们的逻辑是

if a1

{

if a2

then b

}

该如何用断言表达????或许可以写成:“a1 |-> a2 |-> b”,也可以,但常用的表达是:“a1 && a2 |-> b” 或者“a1 ##3 a2 |-> b”

6. 关于断言的时序:时序逻辑的断言需要注意的一个问题:

例如:假设当clk上升沿到来时,b<=a。将上述逻辑写成断言时,如果写成“@(posedgeclk) b==a”,看起来和b<=a一样,但实际上是错的。因为当时钟上升时,b还没有得到a的值,a还需要一段保持时间。即,断言中的信号值实际上是时钟沿到来之前的值,而不是时钟沿到来后他们将要编程的值。所以,b<=a逻辑的断言应该是:“@ (posedgeclk) (a==a,tmp=a) |=> (b==tmp);”

针对上述几点,举一个复杂的例子:

断言wr的功能是检查串行地址输入是否正确,串行地址输入线是 DataIn。$time返回值以0.1ns为单位(因为我在testbench中的单位规定是`timescale 1ns/100ps,精度是100ps = 0.1ns),所以$time/10才是ns。

/////////////////////////////////////////////////////////////////////////////

wr: assert property(wr_p)

$display("succeed:",$time/10);

else

$display("error: ",$time/10);

/////////////////////////////////////////////////////////////////////////////

//断言可以声明一个int数组arr[4],

//“@(posedgeclk) !vld_pulse_r[0] && !DataIn”是真实的预备条件

//“##4 (read==read, arr[0] = DataIn)”只是为了在特定时间内赋值,有用的语句是“arr[0] = DataIn”,//“read==read”是废话,为了编译通过。

//arr赋值完毕后,进入function进行处理,判断实际地址addr跟junc处理过的数据是否相同。

//“addr == junc(arr[0],arr[1],arr[2],arr[3]);”就是junction调用。

propertywr_p;

intarr[4];

@(posedgeclk) !vld_pulse_r[0] && !DataIn

##4 (read==read, arr[0] = DataIn)

##1 (read==read, arr[1] = DataIn)

##1 (read==read, arr[2] = DataIn)

##1 (read==read, arr[3] = DataIn) |=>

addr == junc(arr[0],arr[1],arr[2],arr[3]);

endproperty

//////////////////////////////////////////////////////////////////////////

function [3:0] junc;

inputa,b,c,d;

reg [3:0] a1;

reg [3:0] b1;

reg [3:0] c1;

reg [3:0] d1;

a1 = {3'b0,a};

b1 = {3'b0,b};

c1 = {3'b0,c};

d1 = {3'b0,d};

junc = a1+(b1<<1)+(c1<<2)+(d1<<3);

$display(junc);

endfunction

////////////////////////////////////////////////////////////////////////

7. 如果想在SVA中使用类似for(){....}的功能,别忘了语法中介绍的[*3],这是在断言中实现for的唯一方式。

##4 (废话

, cnt = 0, arr[cnt] = DataIn, cnt++) //初始化一下,

##1 (read==read, arr[cnt] = DataIn, cnt++)[*3] //循环3次

8. 每句断言都是一个小程序:如上例,在##4时间点上,(废话, cnt = 0, arr[cnt] = DataIn, cnt++)就是一个小程序,信号断言必须是第一句,其他运算按照顺序进行。

9. 断言的变量除了可用C语言中的int,float外,还可以是reg [n:0]等数字电路类型。

10. 注意:

像这种写法:

propertyept_p;

@(posedgerd_clk) ((rd_num == 0) |->rd_ept)

&& (rd_ept |-> (rd_num == 0));

endproperty

是错误的,写了|->,就不能再用&&等事件组合逻辑了。

解决方法是使用2个断言,没更好的方法。

基于VerilogHDL的万年历

基于Verilog HDL 的万年历 设计与总结报告 题目名称:基于Verilog HDL 的万年历研究设计报告人:__________ __ ____________ __ 院系/年级/ 专业:___ _____ 指导教师:_ ___________________ 制作日期:_ __ _

基于Verilog HDL 的万年历 摘要 基于Verilog HDL的万年历设计,主要完成的任务是使用Verilog 语言,在Quartus2 上完成电路设计,程序开发模拟,基于功能是能够显示/ 修改年月日时分秒。电路设计模块:分频、控制、时间显示调整、时分秒、年月日、显示控制、译码器。各个模块完成不同的任务,合在一起就构成了万年历电路设计。软件模拟直接在Quartus2 上进行。 随着科学技术的发展,时间观念越来越重,但是老式的钟表以及日历等时间显示工具已不合时宜。对此,数字钟表的设计有了用武之地。基于Verilog 的万年历设计,采用软件开发模拟,开发成本低,而且在功能设计上有了很大的灵活度。同时,该设计的精度远远超过钟表,并且不需要维修。综上所述,本设计具有设计方便、功能多样、电路简洁、成本低廉等优点。符合社会发展趋势,前景广阔。

关键词:万年历,Verilog HDL ,Quartus2

Based on the design of the calendar Verilog HDL circuit Abstract The calendar based on FPGA design, the main task is to use eVrilog language, in the Quartus2 complete circuit design module is divided into several modules: point frequency, control and time display adjustment, arc, date, display, when control, decoder. Each module complete different tasks, together they form a calendar system circuit design. Software simulation on directly in Quartus2. With the development of technology and science, the concept of time is more and more heavey, but old-fashioned clock and calendar etc time display tools are not very good. Key words : Calendar, Verilog HDL ,Quartus2

verilog基本语法

Verilog基本语法 【逻辑值】 逻辑0 表示低电平,GND 逻辑1 表示高电平,VCC 逻辑X 表示未知电平,可能是高电平,也可能是低电平 逻辑Z 表示高阻态,外部没有激励信号,是一个悬空状态 注:高阻态的实质:电路分析时高阻态可做开路理解。 可以把它看作输出(输入)电阻非常大,对下级电路无任何影响。 若为0、x、z则按照假处理;若为1,按真处理。 【进制】 二进制4'b0101 —4位二进制数0101 十进制数4’d2 —4位十进制数2 十六进制数4’ha —4位十六进制数a Verilog中若不指定位宽,默认32位;若不指定位宽不指定进制,默认32位宽的十进制数。 【标识符】 标识符可以是字母、数字、$和_(下划线)的组合,且开头必须是字母或下划线,区分大小写。不建议大小写混合使用。 【数据类型】 寄存器关键字reg,默认初始值位不定值X; reg[31:0] delay_cnt; //[31:0],指定寄存器位宽32位, reg key_reg; // 默认位宽为1. reg类型数据只能在always和initial语句中被赋值。 线网表示结构实体的物理连线,包括wire和tri类型 参数常量,用parameter定义。 parameter H_SYNC = 11'd41; 【运算符】 [条件操作符] ?: 例,a?b:c //如果a为真就选b,否则选择c。 result=(a>=b)?a:b; [逻辑运算符] !&& || [位运算符] ~ & | ^(按位异或) a&b; //自动将位宽小的数高位补零至较大数的位宽,然后按位与操作。[移位运算符] << >> 用0填补移出的空位。左移时位宽增加,右移位宽不变。 [位拼接运算符] {} 例,{a,b} //将a和b拼接起来,作为一个新信号,a为高位。 c={a,b[3:0]}; //a、b位宽均为8位,c为8+4=12位。

基于Verilog的课程设计

基于Verilog的课程设计 直流电机的PWM控制 指导老师:翁嘉民 班级:1031电气自动化技术成员:李高峰9112 王俊才9186 孟令朋9143

目录 1.绪论 (3) 直流电机介绍 (3) 1.1.1直流电机的特点 (3) 1.1.2直流电机的应用 (3) 介绍 (4) 介绍 (4) V ERILOG HDL硬件描述语言 (5) 1.4.1V ERILOG HDL硬件描述语言介绍 (5) 1.4.2V ERILOG HDL功能 (5) PWM脉冲宽度调制介绍 (6) 直流电机的PWM控制 (7) 2.设计原理 (8) 设计原理框图 (8) 原理图 (9) 模块设计 (9) 2.3.1 MOTO_TEST模块 (9) 2.3.4计数器模块 (12) 7实训心得 (13) 参考文献 (13)

直流电机的PWM控制器的设计 1.绪论 直流电机介绍 直流电机是实现直流电能与机械能之间相互转换的一种电力机械,按照直流电机的用途分为直流电动机和直流发电机两类。能够将机械能转换成直流电能的电机称为直流发电机;能够将直流电能转换成机械能的电机称为直流电动机。 1.1.1直流电机的特点 从直流电机与交流电机相比中可以看出,直流电机具有优良的调速性能和启动性能。直流电机具有宽广的调速范围,平滑的无级调速特性,可实现频繁的无级快速启动、制动和反转;过载能力大,能承受频繁的冲击负载;能满足自动化生产系统中各种特殊运行的要求。而直流发电机则能提供无脉动的大功率直流电源,且输出电压可以精确地调节和控制。 1.1.2直流电机的应用 直流电机是交通、工矿、建筑等行业中的常见动力机械,是机电行业人员的重要工作对象和工具。在某些要求调速范围广、速度快、精密度高、控制性能优异的场合,直流电机的应用目前仍占有较大的比重,如大型可逆式轧钢机、内燃机车、矿井卷扬机、造纸和印刷机械、宾馆高速电梯、城市电车、电动自行车、龙门刨床、电力机车、地铁列车、船舶机械、大型精密机床和大型起重机等生产机械中。

基于VerilogHDL的万年历(20210311075245)

基于Verilog HDL的万年历 设计与总结报告 题目名称:基于Verilog HDL的万年历研究设计 报告人:___________________________________________ 院系/年级/专业:________________________ 指导教师:________________________________________ 制作日期:_____________________________

基于Verilog HDL的万年历 摘要 基于Verilog HDL的万年历设计,主要完成的任务是使用Verilog 语言,在Quartus2上完成电路设计,程序开发模拟,基于功能是能够显示/修改年月日时分秒。电路设计模块:分频、控制、时间显示调整、时分秒、年月日、显示控制、译码器。各个模块完成不同的任务,合在一起就构成了万年历电路设计。软件模拟直接在Quartus2上进行。 随着科学技术的发展,时间观念越来越重,但是老式的钟表以 及日历等时间显示工具已不合时宜。对此,数字钟表的设计有了用武之地。基于Verilog的万年历设计,采用软件开发模拟,开发成本低,而且在功能设计上有了很大的灵活度。同时,该设计的精度远远超过钟表,并且不需要维修。综上所述,本设计具有设计方便、功能多样、电路简洁、成本低廉等优点。符合社会发展趋势,前景广阔。 关键词:万年历,Verilog HDL ,Quartus2

Based on the design of the calendar Verilog HDL circuit Abstract The cale ndar based on FPGA desig n, the main task is to use VTilog Ian guage, in the Quartus2 complete circuit desig n module is divided into several modules: point freque ncy, con trol and time display adjustme nt, arc, date, display, whe n con trol, decoder. Each module complete differe nt tasks, together they form a calendar system circuit design. Software simulation on directly in Quartus2. With the developme nt of tech no logy and scie nee, the con cept of time is more and more heavey, but old-fashi oned clock and cale ndar etc time display tools are not very good. Key words : Calendar,Verilog HDL , Quartus2

从Verilog到VHDL(上)基本语法

从Verilog 到VHDL(上)基本语法 16 六 从学校里开始,我所接触的就一直是VerilogHDL 而非更老牌的VHDL, 而且后续接触的项目中也多半是Verilog 的用户,坦白的讲,Verilog 的活力也确实更足一些,从 IEEE1800-2005 开始的SystemVerilog 的标准化,将 Verification 和Design 的一体化的尝试,我个人认为,是走在正确的道路上。 所以,我确实想不到,我竟然也要回头学起VHDL 来了,毕竟一些老牌公司,特别是欧洲的公司,往往因为历史原因,仍然在使用VHDL ,看来终究是绕不过去的了正如一个Design Verification 工程师在目前想完全的不和SpecmanE 打交道是很难的一样。 面记载的是两种语言学习过程中的一些体会,而且更多的是从语法角度出发,算是梳理一下思路吧,而且,以前从来 没有接触过VHDL ,当然会存在很多非常初级的东西。 而在本文之后,打算再写一篇简单阐述下结合Cadence 的IUS 工具,使用SystemVerilog 对VHDL 进行验证的基本方

法。 起手式从Verilog 撞进VHDL 的世界,有些东西要先搞清 楚,否则会一头雾水: 1. 大小写敏感:Verilog 是大小写敏感的,VHDL 则非; 2.注释:Verilog 的行注释为// ,块注释为/**/;VHDL 只 支持 行注释–;[1. 这个算是不方便的一个地方了,不过不 基本结构 论是在Vim 还是Emacs 当中,批量做行注释也很容易实现;] VHDL 被认为是要求更严格,更多讲究的语言,相比和 C 类 似的Verilog ,架构上更严谨一些: 1.基本结构:从上往下为 USE 定义区(调用库和包);Package 定义区(自定义程序包);Entity定义区(定义电路实体外观,I/O接口的规 格); [2. Entity 感觉像是 C 的头文件定义之类的东西,而在Verilog 当中,这些其实都是被整合在Module 里头一起完成 了。]Architecture 定义区(描述内部功能);[3. 同 上,相当于Verilog 的Module 内部实现。]Configuration 定义区(决定那个Architecture 被使用)[4. 这也许就是 之所以要分开 Arch 和Entity 的原因,类似的效果在Verilog 里实现,则

基于verilog的数字秒表的设计实现1

基于FPGA数字秒表的设计实现 一、测试要求 1 有源晶振频率:48MHZ 2 测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒 3 数字秒表的计时精度是10ms 4 显示工作方式: a、用八位BCD七段数码管显示读数 b、采用记忆显示方法 c、用两个按钮开关(一个按钮使秒表复位,另一个按钮 控制秒表的启动/暂停) 二、设计要求 1 设计出符合设计要求的解决方案 2设计出单元电路 3 利用软件对各单元电路及整体电路进行仿真 4 在开发板上实现设计 5 撰写设计报告 三、秒表功能键 1、power:秒表电源键 2、Reset:秒表复位清零键 3、run/stop:秒表启动/停止键 四、实验原理 1 实验设计原理 (1)、秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、分频器、数据选择器、和显示译码器等组成。在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。 (2)、秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;另外两个为间隔符,显示‘-’。8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。

(3)、可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒、十分之一秒、间隔符、秒、十秒、间隔符、分、十分。由频率信号输出端输出频率为100HZ的时钟信号,输入到百分之一秒模块的时钟端clk,百分之一秒模块为100进制的计数器,当计数到“1001”时,百分之一秒模块清零,同时十分之一秒模块加1;十分之一秒模块也为100进制的计数器,当计数到“1001”时,十分之一秒模块清零,同时秒模块加1;以此类推。直到分模块计数到59进59。 (4)、为了消除按键消抖问题,定义寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag 取反一次,当key-flag为0时计数器启动,1时计数器暂停,当key-flag为1同时key-inner[1]为9时,计数器清零。 (5)、定义18位寄存器count用于存放分频和扫描用的计数值。48MHZ的时钟信号480000分频,得到100HZ的时钟信号,而计数器已48MHZ的时钟信号218分频扫描8个七段译码器。 2 实验设计方案 利用一块芯片完成除时钟源,按键和显示器之外的所有数字电路功能。所有数字逻辑功能都在CPLD器件上用Verilog语言实现。这样设计具有体积小,设计周期短,调试方便,故障率地和修改升级容易等特点,本设计采用依次进行消抖、分频、数码管动态扫描、显示(译码)和计数流水线的设计方法。 3 实验原理框图 秒表原理框图 扫描显示 分频48Mhz Reg[1:0]] 计数100hz

基于Verilog的简单计算器设计

module alu4( input wire [3:0]alusel, input wire [3:0]a, input wire [3:0]b, output reg nf, //令标志位output reg zf, //负标志位output reg cf, //进位标志output reg ovf, //溢出位标志output reg [7:0]y, output reg [3:0]rem //余数 ); reg [4:0]temp; reg [7:0]pv; reg [7:0]dp; integer i; reg [1:0]remL; reg [1:0]quotL; always@(*) begin y=0; rem=0; cf=0; ovf=0; nf=0; temp=5'b00000; case(alusel) 4'b0001:y=a; //传递 4'b0010: //加法 begin temp={1'b0,a}+{1'b0,b}; y=temp[3:0]; cf=temp[4]; ovf=y[3]^a[3]^b[3]^cf; end 4'b0011: //减法1 begin temp={1'b0,a}-{1'b0,b}; y=temp[3:0]; cf=temp[4]; ovf=y[3]^a[3]^b[3]^cf; end 4'b0100: //减法二 begin temp={1'b0,b}-{1'b0,a};

y=temp[3:0]; cf=temp[4]; ovf=y[3]^a[3]^b[3]^cf; end 4'b0101: //乘法 begin pv=8'b00000000; dp={4'b0000,b}; for (i=0;i<=3;i=i+1) begin if(a[i]==1) pv=pv+dp; dp={dp[6:0],1'b0}; end y=pv; end 4'b0110:div({1'b0,b[3:0]},a,y,rem); //除法1 4'b0111:div({1'b0,a[3:0]},b,y,rem); //除法2 4'b1000:y=~a; //非 4'b1001:y=a&b; //与 4'b1010:y=a|b; //或 4'b1011:y=a^b; //异或 4'b1100:y={a[2:0],1'b0}; //左移1位 4'b1101:y={a[2:0],a[3]}; //循环左移1位 4'b1110:y={a[0],a[3:1]}; //循环右移1位 4'b1111:y={a[3],a[3:1]}; //算数右移1位 default:y=a; endcase nf=y[3]; if(y==4'b0000) zf=1; else zf=0; if(y>=10) cf=1; else cf=0; if(y>99) ovf=1; else ovf=0; end task div( //定义除法

基于verilog的序列检测

实验八:序列检测一:序列检测的源程序: module jiance(RST_N,CLK,Q,F); input RST_N,CLK,Q; output F; reg F; reg [6:0] s0,s1; always@ (posedge CLK or negedge RST_N) begin if(!RST_N) s0<=7'b1001101; else begin s1=s1<<1; s1[0]=Q; if (s1==s0) F=1'b1; else F=1'b0; end

end endmodule 二:序列检测的测试代码: `timescale 1 ps/ 1 ps module jiance_vlg_tst(); // constants // general purpose registers reg eachvec; // test vector input registers reg CLK; reg Q; reg RST_N; // wires wire F; // assign statements (if any) jiance i1 ( // port map - connection between master ports and signals/registers .CLK(CLK), .F(F), .Q(Q), .RST_N(RST_N)

); initial begin RST_N=0; CLK=1; Q=1; #10 Q=0; CLK=0; #10 Q=0; #10 Q=1; CLK=1; #10 Q=1; #10 Q=0; #10 Q=1; end initial $monitor($time,"%b",CLK,Q,F); endmodule 三:Transcript显示结果: Loading work.jiance_vlg_tst # Loading work.jiance # ** Warning: (vsim-3009) [TSCALE] - Module 'jiance' does not have a `timescale directive in effect, but previous modules do.

基于Verilog HDL 的专用处理器的设计与仿真

基于Verilog HDL 的专用处理器的设计与仿真 葛文婧, 龚咏梅, 江立平 (安徽师范大学数学计算机科学学院,安徽芜湖,241000) 关键词:Verilog HDL;专用处理器;设计;仿真 摘要:随着对嵌入式系统研究的不断深入,专用处理器的针对性使其被广泛采用,这对嵌入式系统的运用和发展起 到了越来越大的推动作用。本文采用Verilog HDL 来仿真能完成特定功能的专用处理器。论文讨论了包括CPU的系统 结构设计、基本组成部件设计、指令系统设计和CPU的RTL级仿真在内的基于Verilog 状态机控制16位指令微处理器 的设计。论文还讨论了电路功能的仿真、综合以及实现过程,在Modelsim 的开发环境下对加法器的HDL程序进行仿真, 并且根据仿真波形来验证设计的正确性。 Design and Simulation of CPU based on Verilog HDL Wenjing Ge, Yongmei Gong, Liping Jiang (School of Mathematic Computer Science , Anhui Nornal University, Wuhu, Anhui, 241000, China) Key words:Verilog HDL; CPU; Design; Simulation Abstract:As t he embedded system’s research went into deeply nowdays, the dedicated-used processor was widely used for it’s pertinency ,which promoted the use and development of embedded system. The authors simulated and designed a dedicated-used processor based on the verilog HDL. The essay was composed of the design of sixteen bits micro dedicated-used processor based on verilog states control machine, which included the designs of the Central Processing Unit’s system structure, basic modules, instructions system ,and RTL level simulation of the dedicated-used processor . The simulation,synthesization,and realization of the circuit function were also included in this essay.The summator’s HDL program was simulated in the environment of Modelsim and checked the correctness of the function of Central Processing Unit by the wave forms in the Modelsim. 计算机的核心构件是处理器,处理器也是嵌入式系统中不可缺少的部分。根据处理的问题的不同,处理机可分为三类:通用处理器、单用途处理器和专用处理器。专用处理器有着广泛的用途,这是因为专用处理器具有针对性,针对应用作了优化,性能、功耗等方面有了显著提高。专用处理器的设计可以给设计者创新的空间,设计出创新性的作品。Verilog HDL是一门硬件描述语言,是用于硬件设计的有利工具。 1概述 1.1 研究背景 目前许多的电子产品都使用了CPLD(复杂可编程逻辑器件),这些逻辑器可以使用硬件描述语言设计。Verilog HDL语言具有:设计的行为特性、设计的数据流特性、设计的结构组成及包含响应监控和设计验证方面的时延和波形产生机制[1]。用Verilog HDL语言设计硬件也较为方便设计逻辑器件。1.2 功能的实现 (1)程序预先存储在程序存储器ROM中; (2)控制器CTRL根据程序计数器PC的值从ROM取指令到指令寄存器IR中,并对IR中的指令进行译码,产生控制信号,将控制信号发送给其它器件; (3)数据通路DP负责接收CTRL传送来的立即数、数据存储器RAM传送过来的操作数,存入寄存器组RF中的寄存器中;负责接收CTRL传送过来的运算指令,并组织算术逻辑单元ALU进行运算;负责将CTRL传送过来的立即数、寄存器中的操作数存入RAM中; (4)RAM可根据DP传送过来的地址和读写控制信号,进行数据读写。 2系统构成及功能模块的划分 2.1 专用处理器的组成结构 专用处理器的结构框图如图1,专用处理器主要有控制器和数据路径两大部分构成,另外,为了配合专用处理器完成系统任务,还需要有程序存储

Verilog语法入门,初学者必看

Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/*” 开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21 //32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3 //一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3 //一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110 // 增强可读性 4’b10?? //相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world” //是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。 reg value; //reg是关键字;value是标识符

VerilogHDL语法基础

Verilog HDL语法基础(1) Verilog的词法约定 1Verilog是大小写相关的,其中的关键字全部为小写。 2空白符由空格、制表符、和换行符组成。 3单行注释以“//”开始,verilog将忽略此处到行尾的内容。多行注释以“/ *”开始,以“*/”结束。多行注释不允许嵌套 4操作符有三种:单目操作符、双目操作符和三目操作符。 5数字声明 Verilog中有两种数字生命:指明位数的数字和不指明位数的数字 指明位数的数字表示形式: Size用来指明数字位宽度,只能用十进制整数表示 Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H) 例如 4’b1111 //4位2进制数 12’h3ac //12位16进制数 不指明位数的数字:如果数字说明中没有指定基数,那么默认表示为十进制数。如果没有指定位宽,则默认的位宽度与仿真器和使用的计算机有关(最小为32位)。 ‘o21//32位八进制数 X值和Z值:不确定值用X表示,高阻用Z值表示。在八进制数中代表3位,十六进制中代表4位。 12’h12X //这是一个12位16进制数,其中低四位不确定 负数:在表示位宽的数字前面增加一个减号来表示它是一个负数。 -6’d3//一个6位的用二进制补码形式存储的十进制数3,表示负数 -6’sd3//一个6位的带符号算数运算的负数 下划线符号和问号: 除了第一个字符,下划线“_”可以出现在数字中的任何位置,它的作用只是提高可读性,在编译阶段会被忽略掉 问号“?”是z的另一种表示,使用问号的目的在于增强casex和casez语句的可读性。在这两条语句中,“?”表示不必关心的情况。 12’B1111_0011_1110// 增强可读性 4’b10??//相当于4’b10zz 6字符串是双引号括起来的一个字符队列。对于字符串的限制是,它必须在一行中书写完,不可书写在多行中,也不能包含回车符。Verilog将字符串当作一个单字节的ASCII字符队列。 “Hello Verilog world”//是一个字符串 7标识符和关键字 关键字是语言中预留的用于定义语言结构的特殊标识符。Verilog中关键字全部小写。 标识符是程序代码中对象的名字,程序员使用标识符来访问对象。Verilog中标识符由字母数字字符、下划线和美元符号组成,区分大小写。其第一个字符必须是数字字符或下划线。

第五章、基于Verilog的CPU设计.(DOC)

作为电子或计算机专业的学生,电脑(计算机)对于大家已经不再是什么新鲜的东西了。大家都知道,计算机可以为我们做很多的事情,替我们节约很多时间,为我们计算各种复杂的数据并且准且无误。那么,计算机为什么能够做这些事情呢?计算机内部到底是怎么工作的呢?本章将为你展示计算机的主要部件的设计过程。 计算机最核心的部分叫做中央处理器,也就是我们常说的CPU ,计算机所做的工作都是由CPU 来完成的。当然,作为学习,我们不能够设计出类似奔腾处理器(Pentium microprocessor )的CPU ,我们用一个能够完成简单功能的简单的CPU 作为讲解,麻雀虽小,五脏俱全,这个简单的cpu 具有一般CPU 的全部基本特征。 CPU 概览 众所周知,cpu 只能识别二进制数据,也就是机器码。所以,在CPU 内部靠不同的二进制序列来区别不同的机器码。我们把这些机器码存储在一个存储器中,共CPU 读取使用。同时,为了用户和程序员能够更好的记住机器码的含义,采用相应的助记符来表示这些机器码,如:用LDA 表示二进制的000等。这些助记符通常被称为汇编语言,不同架构的计算机的汇编语言通常都是各不相同的。 CPU 的内部框架 下图是本章准备设计的一个CPU 内部结构框架。 CPU 的内部工作原理 不同架构的计算机工作原理也是不同的,此处仅以本课本中讲授的CPU 工作原理为例讲解。 首先,CPU 的指令是存储在存储器中的,所以cpu 执行指令的第一步是从存储器中取出(fetch )指令,第二步,将取出的指令解码,第三步,根据指令解码出的功能决定是否再从存储器中取出需要处理的数据,第四步,根据解码出的指令决定进行相应的计算,这由(ALU )完成。第五步,根据解码出的指令决定是否将计算结果存入存储器,第六步,修改PC 指针,为下一次取指令做准备。整个执行过程由控制器控制。 存储器 ALU 控制器 指令解码器 PC

第二章Verilog基本知识

2.1 Verilog HDL的语言要素 Verilog HDL语法来源于C语言基本的语法,其基本此法约定与 C语言类似。 程序的语言要素称为语法,是由符号、数据类型、运算符和表达式构成的,其中符号包括空白符、注释符、和转义标示符、关键字、数值等。 2.1.1 空白符 空白符包括空格符(\b),制表符(\t)、换行符和换页符。空白符使代码看起来结构清晰,阅读起来更方便。在编译过程中,空白符被忽略。 2.1.2 注释符 Verilog HDL语言允许插入注释,标明程序代码功能、修改、版本等信息,以增强程序的可阅读性和帮助管理文档。 Verilog HDL有两种注释方式 1) 单行注释:单行注释以“ // ”开始,Verilog HDL 忽略从此处到行尾的内 容 2) 多行注释:多行注释以“ /* ”开始,到“ */ ”结束,Verilog 忽略 其中的注释内容

在Verilog HDL 中,标识符( Identifier )被用来命令信号名、模块名、参数名等。它可以使任意一组字母、数字、$符号和_符号的组合。应该注意的是,标识符的字符区分大小写,并且第一个字符必须是字母或者下划线 Verilog HDL规定了转义标识符(Escaped Identifie) 采用转义字符可以在一 条标识符中包含任何可打印的字符。转义标识符以“ ”(反斜线)符号开头,以 空白符结尾(空白可以是一个空格、一个制表符或者换行符) 2.1.4 关键字 Verilog HDL语言内部已经使用的词称为关键字或保留字,它是 Verilog HDL语言的内部专用词,是事先定义好的确认符,用来组织语言结构的。需要注意的是,在Verilog HDL中,保留字都是小写的。

基于verilog的数字秒表的设计实现

基于verilog的数字秒表的设计实现

数字秒表的设计实现 团队成员:董婷詹磊胡鹏 一、测试要求 1. 有源晶振频率:24MHZ 2. 测试计时范围:00’00”00 ~ 59’59”99,显示的最长时间为59分59 秒 3. 数字秒表的计时精度是10ms 4. 显示工作方式: a、用八位数码管显示读数 b、用两个按钮开关(一个按钮使秒表复位,另 一个按钮控制秒表的启动/暂停) 二、设计要求 1. 设计出符合设计要求的解决方案 2. 利用软件对各单元电路及整体电路进行仿真 3. 在开发板上实现设计 5. 撰写设计报告 三、秒表功能键 1、power:秒表电源键 2、Reset:秒表复位清零键 3、run/stop:秒表启动/停止键

四、实验原理 1 .实验设计原理 (1)秒表的逻辑结构较简单,它主要由十进制计数器、六进制计数器、分频器、数据选择器、和显示译码器等组成。在整个秒表中最关键的是如何获得一个精确的100HZ计时脉冲,除此之外,整个秒表还需有一个启动信号和一个清零信号,以便秒表能随意停止、启动以及清零复位。 (2)秒表有共有8个输出显示,其中6个显示输出数据,分别为百分之一秒、十分之一秒、秒、十秒、分、十分,所以共有6个计数器与之相对应;另外两个为间隔符,显示‘-’。8个计数器的输出全都为BCD码输出,这样便与同显示译码器连接。 (3)可定义一个24位二进制的寄存器hour用于存放8个计数器的输出,寄存器从高位到低位每连续4位为一组,分别存放百分之一秒、十分之一秒、间隔符、秒、十秒、间隔符、分、十分。由频率信号输出端输出频率为100HZ的时钟信号,输入到百分之一秒模块的时钟端clk,百分之一秒模块为100进制的计数器,当计数到“1001”时,百分之一秒模块清零,同时十分之一秒模块加1;十分之一秒模块也为100进制的计数器,当计数到“1001”时,十分之一秒模块清零,同时秒模块加1;以此类推。直到分模块计数到59进59。(4)为了消除按键消抖问题,定义寄存器key-inner来存储按键key的输入信号,key-flag作为启动/暂停的转换标志,key-inner[0]出现一个下降沿时,key-flag取反一次,当key-flag为0时计数器

基于Verilog-HDL语言的可综合性设计

基于Verilog HDL语言的可综合性设计 1 引言 逻辑综合带来了数字设计行业的革命,有效地提高了生产率,减少了设计周期时间。在手动转换设计的年代,设计过程受到诸多限制,结更容易带来人为的错误。而一个小小的错误就导致整个模块需进行重新设计,设计转换工作占去了整个设计周期的大部分时间,验证工作进行困难,设计技术无法重用等等。而自动逻辑综合工具的出现,突破了上述种种限制,使得设计者从繁琐的转换工作中解脱出来,将更多的时间用于验证和优化,不仅保证了功能的实现,而且有利于提高性能。可见,综合在逻辑设计中具有举足轻重的作用。 2 综合的概念及其过程 2.1 逻辑综合概述 综合就是在给定标准元件库和一定的设计约束条件下,把用语言描述的电路模型转换成门级网表的过程。要完成一次综合过程,必须包含三要素:RTL级描述、约束条件和工艺库。 2.2 RTL级描述 RTL级描述是以规定设计中采用各种寄存器形式为特征,然后在寄存器之间插入组合逻辑,其可以用如图1所示的“寄存器和云图”方式来表示。 图1 RTL级描述 2.3 约束条件 为了控制优化输出和映射工艺要用约束,它为优化和映射试图满足的工艺约束提供了目标,并且它们控制设计的结构实现方式。目前综合工具中可用的约束包括面积、速度、功耗和可测性约束,未来我们或许会看到对封装的约束和对布图的约束等,但是,目前的最普遍的约束是按面积和按时间的约束。 时钟限制条件规定时钟的工作频率,面积限制条件规定该设计将花的最大面积。综合工具将试图用各种可能的规则和算法尽可能地满足这些条件。 2.4 工艺库 按照所希望的逻辑行为功能和有关的约束建立设计的网表时,工艺库持有综合工具必须的全部信息。工艺库含有允许综合进程为建立设计做正确选择的全部信息,工艺库不仅含有ASIC单元的逻辑功能,而且还有该单元的面积、单元输入到输出的定时关系、有关单元扇出的某种限制和对单元所需的定时检查。

基于-verilog的抢答器设计

基于Verilog语言的二路抢答器设计实验报告 电子科学与工程学院 121180052 璇 一、实验目的 1、掌握数字系统中触发器、计数器的设计要素。 2、掌握触发器、计数器的VerilogHDL代码编写。 3、进一步掌握ISE软件的用法,学习代码下载的方法。 二、实验步骤 1、设计限时和复位电路。 2、编写限时/复位电路的VerilogHDL代码并综合、仿真。 3、实现限时抢答器并下载到开发板上进行验证。 三、实验原理 1、设计二路抢答器 2、设计定时器和复位电路 可使用计数器来实现定时功能。而给定时间的定时,可以让计数器的输出与特定值比较来实现。这个特定的预置数由时钟频率和定时时间决定。 这个基本想法如下图所示。 图中,“时间到”信号接到计数器的清零端,以便下次计数从0开始。 这里,还需要一个计时开始的功能按键,用来启动计数器的计时。那么,计数器就需要一个使能端,受控于“计时开始”按键。我们知道,EN信号是一个持续信号(允许时保持电平),而“时间到”信号是一个持续时间很短的脉冲,因此还需要一个触发器来产生计数器的EN信号。 复位信号由“时间到”信号和复位按键相或来得到。完整的限时和复位电路如下图所示。

四、实验代码 //主程序部分 Module responder ( input clk, input set, input reset, input wire in_a, input wire in_b, output wire q_a, output wire q_b, output en ); wire clr; wire[27:0]t; wire clk_10; wire timeout; reg[27:0] n=28'h1ffffff; assign clr = reset||timeout; trig trigger( .set(set), .clk(clk_10), .clr(clr), .en(en) ); count counter( .clk(clk_10), .clr(clr),

基于verilog的除法器

module divider(quotient,remainder,ready,error,word1,word2,start,clock,reset); parameter L_divn=8, L_divr=4, S_idle=0,S_adivr=1,S_adivn=2,S_div=3,S_err=4, L_state=3,L_cnt=4,Max_cnt=L_divn-L_divr; output [L_divn-1:0] quotient,remainder; output ready,error; input [L_divn-1:0] word1;//dividend input [L_divr-1:0] word2;//divisor input start,clock,reset;//0,start,1,reset reg [L_state-1:0] state,next_state; reg Load_words,Subtract,Shift_dividend,Shift_divisor; reg [L_divn-1:0] quotient; reg [L_divn:0] dividend; reg [L_divr-1:0] divisor; reg [L_cnt-1:0] num_Shift_dividend,num_Shift_divisor; reg [L_divr:0] comparison; wire MSB_divr=divisor[L_divr-1]; wire ready=((state==S_idle)&&reset); wire error=(state==S_err); wire Max=(num_Shift_dividend==Max_cnt+num_Shift_divisor); wire sign_bit=comparison[L_divr]; assign remainder=(dividend[L_divn-1:L_divn-L_divr])>num_Shift_divisor;///////// always @(state or dividend or divisor or MSB_divr) case(state) S_adivr: if(MSB_divr==0) comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~(divisor<<1)}+1'b1; else comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~divisor[L_divr-1:0]}+1'b1; default: comparison=dividend[L_divn:L_divn-L_divr]+{1'b1,~divisor[L_divr-1:0]}+1'b1; endcase always @(posedge clock or negedge reset) if(!reset) state<=S_idle; else state<=next_state; always @(state or word1 or word2 or start or comparison or sign_bit or Max)

相关文档
最新文档