verilog的仿真问题

verilog的仿真问题
verilog的仿真问题

你好,我们在做verilog仿真时遇到了一些问题,希望你能帮我们看看。下面我就简要的说说什么问题啊!

就是如下所示的原理图:电路主要由一个DIV8分频的模块、一个DIV2分频的模块和外部一些控制的信号模块组成,使得这两个分频模块能够正常工作,从而实现电路的计数功能(当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一个高电平)。

INPUT的端口有:

CLK_32.768:时钟信号,上升有效。

CLK_AFTER_DIV:分频模块出来的时钟信号,作为DIV8的时钟信号。

HOLD:DIV8的控制端口,低电平有效,高电平则保持上一个状态。

IN7:控制端口,高电平有效。

IN8:控制端口,低电平有效。

IN9:控制端口,低电平有效。

S_0:控制端口,低电平有效。

CON:控制端口,高电平有效。

CLR_0 :清0端口,低电平有效。

OUTPUT的端口有:

OUT:计数器的输出端口。

用spectre仿真得到的结果如下:

仿真结果描述如下:

1、当IN7=CON=1,IN8=IN9=HOLD=S_0=0的时候才能使得DIV8_BLOCK

的SET2_0置1、SET3_1置0及才能实现计数功能。如果其中有一个条

件不能满足的话,都不可能实现计数功能。

2、当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一

个高电平。

我们的问题是:如果我们用verilog仿真时却得不到和spectre一样的结果。Spectre可以仿出正确的结果,即:当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一个高电平。当我们用verilog仿真时得到的结果却如下:

即输出端OUT出现很多不定态。而且没有实现分频的效果。

其中仿真语言编写如下:

initial

begin

CLK_32_768 = 1'b0;

CLK_AFTER_DIV = 1'b0;

CLR_0 = 1'b1;

CON = 1'b1;

HOLD = 1'b0;

IN7 = 1'b1;

IN8 = 1'b0;

IN9 = 1'b0;

S_0 = 1'b0;

end

always #1 CLK_32_768=~CLK_32_768;

always #1.5 CLK_AFTER_DIV=~CLK_AFTER_DIV;

initial #1000 $finish;

我们仔细分析了下上述原理图后,发现问题是出在原理图中的一个模块名为DIV8_BLOCK的模块。DIV8_BLOCK的模块是实现256分频的电路,他是由8个2分频的电路模块叠起来的。利用低一级的分频输出OUT来控制下一级的分频,从而达到256分频的效果。具体框图如下:

电路内部结构如下:(由于都是一样的电路的叠加,所以只画出一小部分)

其中INPUT:

CLK:分频模块时钟信号,上升有效。

CLR_0 :清0端口,低电平有效。

HOLD:控制信号端口,低电平有效,高电平的时候保持上一个状态。

HOLD=0,SET3_1=0,SET2_0=1 ,电路实现分频功能,DIV_OUT和OUT输出频率等于CLK/256。

OUTPUT:

OUT:计数器的输出端口。

当我们用verilog仿真时得到的结果却如下:

图中的OUTX等表示为X分频。从图中我们可以看到:电路在8到16分频时发生了错误,使得最后的仿真结果OUT和16分频的结果出错,并出现了很多不定态。具体什么原因我们也不清楚,请帮我们看看!下面是我们用语仿真的语言描写:

initial

begin

CLK = 1'b0;

CLR_0 = 1'b0;

HOLD = 1'b0;

SET2_0 = 1'b1;

SET3_1 = 1'b0;

#5 CLR_0=1;

end

always #1 CLK=~CLK;

initial #1000 $finish;

其中我们在用verilog仿真时电路中的各个门描述如下:

电路中所有门都是调用自己建立的library,不是调用sample里的门的。(以INV 反向器为例)

1.在自己建立的library中建立INV这个cell,其view有3个分别为functional,schematic和symbol。如下图所示:

其中schematic图如下:

其中functional的建立过程如下:在composer schematic editing中:

里面选:

就会生成一个functional文件:

接下去就自己写上需要的verilog语言就好了。如下所示。

Verilog可综合与不可综合语句汇总

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点:(1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

verilog不可被综合的语句

verilog 不可综合语句总结汇总 2009-04-20 18:37 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 (2)所有综合工具都不支持的结构:time,defparam,$finish,fork,join,initial,delays,UDP,wait。 (3)有些工具支持有些工具不支持的结构:casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。 (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 不可综合verilog语句2009-04-14 19:33

可综合的Verilog语句

可综合Verilog语句 ?一: 综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表. ?二. 设计流程中的综合 ?Verilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。事实上,Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.?正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式. ?使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的. ?这一局限性使设计者不仅需要理解Verilog HDL ,而且必须理解特定综合系统的建模方式, 才能编写出可综合的模型.可综合的数据类型?1.网线数据类型: ?Wire,wor,wand,tri,supply0,supply1 ?2.寄存器数据类型: ?Reg,integer ?Time,real:不能综合. ?3.常量: ?整型. ?实型和字符串型不能综合.可综合的运算符?1.逻辑运算符能直接映射成硬件中的基本逻辑门. ?2.算术运算符 ?3.关系运算符: ?能综合的有:>,<,<=,>=. ?4.相等性算符: ?能够综合的有:==和!=. ?不能综合:===和!==(有些工具按==和!=综合). ?5.移位运算符: ?<<和>>,移位腾出的位都补0. 多个时钟的可综合情况 ?1.多个时钟的情况:对变量的赋值不能受多个时钟控制 例如: ? module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub);

Verilog中的一些语法和技巧

1、. 2、. 3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但 是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。 4、在数据类型中?和Z均表示高阻态。 5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定 是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。 6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型 数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0]; 7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。 8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动 地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。 9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是 2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0. 10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变 量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。 11、模块的描述方式:(RTL为寄存器传输级描述) “(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

verilog中可综合和不可综合语句概述

Verilog 中可综合及不可综合语句概述Verilog 硬件描述语言有很完整的语法结构和系统,类似高级语言,这些语法结构的应用给我们的设计描述带来很多方便。但是,我们知道,Verilog 是描述硬件电路的,它是建立在硬件电路的基础上的。有些语法结构是不能与实际硬件电路对应起来的,也就是说我们在把一个语言描述的程序映射成实际硬件电路中的结构时是不能实现的。下面就是我多年工作经验总结出来的大部分综合工具支持或不支持的verilog 语法结构。 一.用verilog 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial 。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while 等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 ( 12)避免混合使用上升沿和下降沿触发的触发器。 ( 13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 二.不可综合verilog 语句 1 、initial 只能在testbench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial 也可以综合,不知道为什么) 2、events event 在同步test bench 时更有用,不能综合。 3、real 不支持real 数据类型的综合。 4、time 不支持time 数据类型的综合。 5、force 和release 不支持force禾口release的综合。 6、assign 禾口deassign 不支持对reg数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join

Verilog HDL语言的描述语句

第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);

endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块

Verilog HDL常用的行为仿真描述语句(一)

Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end

1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin

// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)

veriloghdl的行为语句

Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。

5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

实验二 verilog行为语句实验

实验二:基于verilogHDL行为语句的电路设计班级:姓名:学号: 作业完成后,以班级为单位,班长或课代表收集齐电子版实验报告,统一提交. 文件命名规则如“通1_王五_学号” 一、实验目的 1、了解verilog HDL行为语句,可综合与非可综合 2、掌握always过程块的格式,注意事项 3、掌握串行块begin-end、assign持续赋值 4、掌握if-else、for、·define、等可综合过程语句 5、练习基本的组合电路和时序电路的verilogHDL设计与仿真 二、预习要求 1.了解veirlogHDL行为语句。 2. Verilog HDL的模块结构的组成。 3.简单电路系统设计的流程和方法。 三、实验基本概念 1、74HC138的功能表入下 2、74160的功能表

3、74161 四、实验内容 (一)典型习题的验证与仿真 设计要求: 1、将课本(课件)中的模256计数器在QuartusII进行编辑和综合,体会计数器设计,注意控制信号的同步、异步,高电平与低电平有效的问题。 2、将阻塞赋值与非阻塞赋值的实例进行综合,对比RTL与门级视图,体会区别。 3、将模60的BCD码加法计数器进行编辑、综合和仿真,并思考数电仿真中的24进制加法

器电路设计与此设计的关联性,可尝试设计一个模24进制计数器。 4.BCD码的七段管译码器设计 5、for循环实现2个8位乘法,尝试用别的方法设计乘法器并进行综合,并进行对比 6、过程和结果(后面继续添加) 上述题目,课件皆有源代码,如果个人对代码有改进,有引申,将代码黏贴到下面空白处,或者写一下自己对上述需注意问题的体会。(内容不限) (二)设计一个类似于74138的译码器电路 设计要求: 1、用verilog设计译码器,并进行综合和仿真 2.观察RTL级和门级综合视图,对比在数字电路上学过的电路结构。 3.QuartusII进行功能仿真,验证设计的正确性。 4、过程和结果(后面继续添加) 将在程序编辑、编译过程中的错误进行记录(截图或者文本),并错误指出来 (2)代码与仿真结果(结果截图) module test(s1,s2,s3,a0,a1,a2,y0,y1,y2,y3,y4,y5,y6,y7); input s1,s2,s3,a0,a1,a2; output reg y0,y1,y2,y3,y4,y5,y6,y7; always @(s1 or s2 or s3 or a0 or a1 or a2) begin if((~s1)|(~(s2&s3))) {y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111111; if(s1&(s2&s3)) begin case({a2,a1,a0}) 3'b000:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111110; 3'b001:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111101; 3'b010:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111011; 3'b011:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11110111; 3'b100:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11101111; 3'b101:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11011111; 3'b110:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b10111111; 3'b111:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b01111111; default:{y7,y6,y5,y4,y3,y2,y1,y0}=7'bxxxxxxxx; endcase end end endmodule

相关主题
相关文档
最新文档