《北大数字集成电路Verilog任务与函数.pptx》由会员分享,可在线阅读,更多相关《北大数字集成电路Verilog任务与函数.pptx(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Verilog的任务及函数 结构化设计是将任务分解为较小的,更易管理的单元,并将可重用代码进行封装。这通过将设计分成模块,或任务和函数实现。任务(task)通常用于调试,或对硬件进行行为描述可以包含时序控制(#延迟,,wait)可以有 input,output,和inout参数可以调用其他任务或函数函数(function)通常用于计算,或描述组合逻辑不能包含任何延迟;函数仿真时间为0只含有input参数并由函数名返回一个结果可以调用其他函数,但不能调用任务第1页/共21页Verilog的任务及函数任务和函数必须在module内调用在任务和函数中不能声明wire所有输入/输出都是局部寄存器任务/
2、函数执行完成后才返回结果。例如,若任务/函数中有forever语句,则永远不会返回结果第2页/共21页任务 下面的任务中含有时序控制和一个输入,并引用了一个module变量,但没有输出、输入输出和内部变量,也不显示任何结果。时序控制中使用的信号(例如ck)一定不能作为任务的输入,因为输入值只向该任务传送一次。module top;reg clk,a,b;DUT u1(out,a,b,clk);always#5 clk=!clk;task neg_clocks;input 31:0 number_of_edges;repeat(number_of_edges)(negedge clk);endt
3、ask initial begin clk=0;a=1;b=1;neg_clocks(3);/任务调用 a=0;neg_clocks(5);b=0;endendmodule第3页/共21页任务任务可以有input,output 和 inout参数。传送到任务的参数和与任务I/O说明顺序相同。尽管传送到任务的参数名称与任务内部I/O说明的名字可以相同,但在实际中这通常不是一个好的方法。参数名的唯一性可以使任务具有好的模块性。可以在任务内使用时序控制。在Verilog中任务定义一个新范围(scope)要禁止任务,使用关键字disable。主要特点:从代码中多处调用任务时要小心。因为任务的局部变量的
4、只有一个拷贝,并行调用任务可能导致错误的结果。在任务中使用时序控制时这种情况时常发生。在任务或函数中引用调用模块的变量时要小心。如果想使任务或函数能从另一个模块调用,则所有在任务或函数内部用到的变量都必须列在端口列表中。第4页/共21页任务 下面的任务中有输入,输出,时序控制和一个内部变量,并且引用了一个module变量。但没有双向端口,也没有显示。任务调用时的参数按任务定义的顺序列出。module mult(clk,a,b,out,en_mult);input clk,en_mult;input 3:0 a,b;output 7:0 out;reg 7:0 out;always(posedg
5、e clk)multme(a,b,out);/任务调用 task multme;/任务定义 input 3:0 xme,tome;output 7:0 result;wait(en_mult)result=xme*tome;endtaskendmodule第5页/共21页函数(function)函数中不能有时序控制,但调用它的过程可以有时序控制。函数名f_or_and在函数中作为register使用module orand(a,b,c,d,e,out);input 7:0 a,b,c,d,e;output 7:0 out;reg 7:0 out;always(a or b or c or d
6、or e)out=f_or_and(a,b,c,d,e);/函数调用 function 7:0 f_or_and;input 7:0 a,b,c,d,e;if (e=1)f_or_and=(a|b)&(c|d);else f_or_and=0;endfunctionendmodule第6页/共21页函数主要特性:函数定义中不能包含任何时序控制语句。函数至少有一个输入,不能包含任何输出或双向端口。函数只返回一个数据,其缺省为reg类型。传送到函数的参数顺序和函数输入参数的说明顺序相同。函数在模块(module)内部定义。函数不能调用任务,但任务可以调用函数。函数在Verilog中定义了一个新的范
7、围(scope)。虽然函数只返回单个值,但返回的值可以直接给信号连接赋值。这在需要有多个输出时非常有效。o1,o2,o3,o4=f_ or_ and(a,b,c,d,e);第7页/共21页函数 要返回一个向量值(多于一位),在函数定义时在函数名前说明范围。函数中需要多条语句时用begin和end。不管在函数内对函数名进行多少次赋值,值只返回一次。下例中,函数还在内部声明了一个整数。module foo;input 7:0 loo;output 7:0 goo;/可以持续赋值中调用函数 wire 7:0 goo=zero_count(loo);function 3:0 zero_count;in
8、put 7:0 in_ bus;integer I;begin zero_count=0;for(I=0;I 8;I=I+1)if(!in_bus I)zero_count=zero_count+1;end endfunctionendmodule第8页/共21页函数函数返回值可以声明为其它register类型:integer,real,或time。在任何表达式中都可调用函数module checksub(neg,a,b);output neg;reg neg;input a,b;function integer subtr;input 7:0 in_a,in_b;subtr=in_a-in_
9、b;/结果可能为负 endfunction always (a or b)if(subtr(a,b)0)neg=1;else neg=0;endmodule第9页/共21页函数函数中可以对返回值的个别位进行赋值。函数值的位数、函数端口甚至函数功能都可以参数化。.parameter MAX_BITS=8;reg MAX_BITS:1 D;function MAX_BITS:1 reverse_bits;input MAX_BITS-1:0 data;integer K;for(K=0;K MAX_BITS;K=K+1)reverse_ bits MAX_BITS-(K+1)=data K;end
10、functionalways (posedge clk)D=reverse_bits(D);.第10页/共21页命名块(named block)在关键词begin或fork后加上:对块进行命名module named_ blk;.begin:seq_blk.end.fork:par_blk.join.endmodule 在命名块中可以声明局部变量 可以使用关键词disable禁止一个命名块 命名块定义了一个新的范围 命名块会降低仿真速度第11页/共21页禁止命名块和任务module do_arith(out,a,b,c,d,e,clk,en_mult);input clk,en_mult;in
11、put 7:0 a,b,c,d,e;output 15:0 out;reg 15:0 out;always(posedge clk)begin:arith_block/*命名块*reg 3:0 tmp1,tmp2;/*局部变量*tmp1,tmp2=f_or_and(a,b,c,d,e);/函数调用 if(en_mult)multme(tmp1,tmp2,out);/任务调用 end always(negedge en_mult)begin/中止运算 disable multme;/*禁止任务*disable arith_block;/*禁止命名块*end/下面定义任务和函数 endmodule
12、第12页/共21页禁止命名块和任务disable语句终结一个命名块或任务的所有活动。也就是说,在一个语句终结一个命名块或任务的所有活动。也就是说,在一个命名块或任务中的所有语句执行完之前就返回。命名块或任务中的所有语句执行完之前就返回。语法:语法:disable 或或 disable 当当命命名名块块或或任任务务被被禁禁止止时时,所所有有因因他他们们调调度度的的事事件件将将从从事事件件队队列列中中清除清除disable是典型的不可综合语句。是典型的不可综合语句。在在前前面面的的例例子子中中,只只禁禁止止命命名名块块也也可可以以达达到到同同样样的的目目的的:所所有有由由命命名块、任务及其中的函数
13、调度的事件都被取消。名块、任务及其中的函数调度的事件都被取消。第13页/共21页有限状态机隐式状态机FSM 不需要声明状态寄存器 仿真效率高 只适合于线性的状态改变 大多数综合工具不能处理显式FSM:利于结构化 易于处理缺省条件 能处理复杂的状态改变 所有综合工具都支持 第14页/共21页有限状态机在隐式FSM中,只要数据在一个时钟沿写入并在另一个周期读出,则会生成寄存器。所有FSM必须有复位,且状态改变必须在单一时钟信号的同一边沿。通常,如果状态改变简单明确,且综合工具接受隐式状态机,就可以使用隐式类型。如果状态改变很复杂,则显式类型更加有效。隐式状态机是一个行为级而非RTL代码的典型例子。
14、这种代码依赖循环和内嵌时序控制,有时也有命名事件、wait和disable语句。因此,隐式状态机在综合时通常不被支持。线性FSM是指从一个状态到下一个状态的转换不需要任何条件。第15页/共21页显式有限状态机module exp(out,datain,clk,rst);input clk,rst,datain;output out;reg out;reg state;always(posedge clk or posedge rst)if(rst)state,out=2b00;else case(state)1b0:begin out=1b0;if(!datain)state=1b0;else
15、 state=1b1;end 1b1:begin out=datain;state=1b0;end default:state,out=2b00;endcaseendmodule第16页/共21页显式有限状态机可以在过程块中用单一时钟边沿和case语句显式地描述FSM。必须声明定义状态机的状态状态变量。要改变当前状态,必须在时钟边沿改变状态变量的值。给通常不会发生的条件指定缺省动作是一个很好的描述方式。第17页/共21页隐式有限状态机module imp(out,datain,clk,rst);output out;reg out;input clk,datain,rst;always(rst
16、)/Synergy reset method if(rst)assign out=1b0;else begin deassign out;disable seq_block;/返回初始状态 end always(posedge clk)begin:seq_block out=1b0;if(!datain)/状态1:output=0 disable seq_block;/状态2:output=2nd bit (posedge clk)out=datain;endendmodule第18页/共21页隐式有限状态机可以在过程块中用多个时钟边沿(每个状态一个),条件语句,循环,和disable语句隐式
17、地描述一个FSM。通常不可综合。不必声明状态变量。在下一个时钟边沿改变状态,除非迫使状态重复。例如在一个循环中或用一个disable语句。下一个状态可以由条件语句决定。第19页/共21页复习1.在Verilog中什么结构能产生一个新的“范围”?2.哪些结构可以被禁止?3.什么时候一个函数比一个任务更合适?反过来呢?解答1.模块,任务,函数,和命名块。Verilog中模块作为主要层次分割方法。函数和任务提供附加的代码分割和封装方法。2.命名块和任务可以被禁止。3.函数更适用于组合逻辑描述,并且使用灵活(例如在一个持续赋值的右边或在一个端口列表里)。如果需要时序控制,则任务更适合。任务还可以被禁止。第20页/共21页感谢您的观看!第21页/共21页