verilog中的函数和任务能综合吗

作者&投稿:暨娟 (若有异议请与网页底部的电邮联系)
verilog中的函数和任务能综合吗~

简单的函数是可以综合的,任务一般是不可综合的。这个是有标准可以查的。

任务和函数有助于简化程序,有点类似与Fortran语言的subroutine和function。

任务和函数的共同点:

1.任务和函数必须在模块内定义,其作用范围仅适用于该模块,可以在模块内多次调用。

2.任务和函数中可以声明局部变量,如寄存器,时间,整数,实数和事件,但是不能声明线网类型的变量。

3.任务和函数中只能使用行为级语句,但是不能包含always和initial块,设计者可以在always和initial块中调用任务和函数。

任务和函数的不同点:
函数 任务
函数能调用另一个函数,但是不能调用任务 任务可以调用另一个任务,也可以调用函数
函数总是在仿真时刻0开始 任务可以在非零时刻开始执行
函数一定不能包含任何延迟,事件或者时序控制声明语句 任务可以包含延迟,事件或者时序控制声明语句
函数至少要有一个输入变量,也可以有多个输入变量 任务可以没有或者有多个输入,输出,输入输出变量
函数只能返回一个值,函数不能有输出或者双向变量 任务不返回任何值,或者返回多个输出或双向变量值

由上述的特点决定:函数用于替代纯组合逻辑的verilog代码,而任务可以代替verilog的任何代码。

8.2任务

任务使用关键字task和endtask来进行声明,如果子程序满足下面任何一个条件,则必须使用任务而不能使用函数。

1.子程序中包含有延迟,时序或者事件控制结构

2.没有输出或者输出变量超过一个

3.没有输入变量

例:

module operation;
parameter delay=10;
reg [15:0] A,B, AB_AND,AB_OR,AB_XOR;
always @(A or B)
begin
bitwise_ope(AB_AND,AB_OR,AB_XOR,A,B);
end
task bitwise_oper;
output [15:0] ab_and,ab_or,ab_xor;
input [15:0] a,b;
begin
#delay ab_and=a&b;
ab_or=a|b;
ab_xor=a^b;
end
endtask
always @(posedge clk)
bitwise_xor(ef_xor,e,f);
always @(posedege clk2)
bitwise_xor(cd_xor,c,d)
task autumatic bitwise_xor;
output ab_xor;
input a,b;
begin
ab_xor=a^b;
end
endtask
endmodule

自动(可重入)任务:verilog任务中所有声明的变量地址空间都是静态分配的,因此如果在一个模块中多次调用任务时,可能会造成地址空间的冲突,为了避免这个问题,verilog通过在task关键字后面添加automatic使任务称为可重入的,这时在调用任务时,会自动给任务声明变量分配动态地址空间,这样有效避免了地址空间的冲突。

8.3 函数

函数使用关键字function和endfunction定义,对于子程序,如果满足下述所有条件则可以用函数来完成:

1.在子程序中不含有延迟时序或者控制结构
2.子程序只有一个返回值
3.至少有一个输入变量
4.没有输出或者双向变量
5.不含有非阻塞赋值语句

例:

module parity;
reg [31:0] addr;
reg parity;
always @(addr)
begin
parity=calc_parity(addr);
end
function calc_parity;
input [31:0] addr;
begin
calc_parity=^addr;
end
endfunction
endmodule

跟任务调用一样,在模块中如果调用多次函数,也会碰到地址冲突的问题,因此也引入automatic关键字来对函数可重用性声明。没有进行可重用性声明的函数不可以多次或者递归调用,进行了可重用性声明的函数可以递归调用。

常量函数和带符号函数(函数声明时加signed关键字说明)

module ram;
parameter RAM_DEPTH=256;
input [clogb2(RAM_DEPTH)-1:0] addr;//clogb2函数返回值为8
function integer clogb2(input integer depth);
begin
for(clogb2=0; depth>0;clogb2=clogb2+1)
depth=depth>1;
end
endfunction
endmodule

练习:用两种不同的方法设计一个功能相同的模块,完成4个8位2进制输入数据的冒泡排序。第一种,用纯组合逻辑实现;第二种,假设8位数据按照时钟节拍串行输入,要求时钟触发任务的执行,每个时钟周期完成一次数据交换的操作。

//----------------- 第一种 ------------------

module sort4(ra,rb,rc,rd,a,b,c,d);

output[7:0] ra,rb,rc,rd;

input[7:0] a,b,c,d;

reg[7:0] ra,rb,rc,rd;

reg[7:0] va,vb,vc,vd;

always @ (a or b or c or d)

begin

{va,vb,vc,vd}={a,b,c,d};

change(va,vb);

change(vb,vc);

change(vc,vd);

change(va,vb);

change(vb,vc);

change(va,vb);

{ra,rb,rc,rd}={va,vb,vc,vd};

end

task change; //make a task of comparing

inout[7:0] x,y;

reg[7:0] tmp;

if(x>y)

begin

tmp=x;

x=y;

y=tmp;

end

endtask

endmodule

//----------------- 第二种 ------------------

module sort4(clk,reset,ra,rb,rc,rd,a);

output[7:0] ra,rb,rc,rd;

input[7:0] a;

input clk,reset;

reg[7:0] ra,rb,rc,rd;

reg[7:0] va,vb,vc,vd;

always @ (posedge clk)

begin

if(!reset)

begin

va<=0;vb<=0;vc<=0;vd<=0;

end

else

va<=a;

end

always @ (posedge clk)

begin

change(va,vb);

change(vb,vc);

change(vc,vd);

change(va,vb);

change(vb,vc);

change(va,vb);

{ra,rb,rc,rd}={va,vb,vc,vd};

end

task change; //make a task of comparing

inout[7:0] x,y;

reg[7:0] tmp;

if(x>y)

begin

tmp=x;

x=y;

y=tmp;

end

endtask

endmodule

可以综合 只不过仿真调试里用得相对多
但有时函数和任务可以导出相应的物理电路,有时就不会,这要看函数和任务的功能是什么了


Verilog中的&random系统函数
{$random} 这个语句是不能综合的,只能作为仿真来使用,一般都用在testbench里面,仿真的话这个程序用modelsim是可以通过的。要想产生可综合的程序,楼主可以研究下伪随机序列的算法,使用fpga实现。

VERILOG里 任务和函数 的问题:
任务和函数如果要综合的话,里面都不能有延时符号,它们综合出来以后,在电路结构上都是组合逻辑。拿函数来说,它实际上是一个独立的组合逻辑,当满足一定的条件时,就将某些信号接到它的输入端,并将输出端的信号接回来。所以,不能同时满足多个条件时调用,否则输出就是混乱的。

Verilog中的&random系统函数
你把他放在always @(posedge clk)里了吧,这个不能综合要放在initial下面,要循环的可以用while或者for等等,这些函数都是不可综合的。

verilog中的函数和任务能综合吗
可以综合 只不过仿真调试里用得相对多 但有时函数和任务可以导出相应的物理电路,有时就不会,这要看函数和任务的功能是什么了

在verilog实验中运用function函数实现阶乘怎么分析
错在第18行:reg [3:0]i=1; 应该分着写:reg[31:0] i;begin之后写i = 1;function [31:0] factorial;input[3:0] pram_n;reg[3:0] i;\/\/分开写 begin i = 1;factorial=pram_n?1:0;factorial=1;for(i=2;i<=pram_n;i=i+1)factorial=i*factorial;end endfunction 原因是:...

1、我想用verilog中的系统函数$random产生64个随机数作为激励输入,请问...
a={$random}%64;

Verilog 编程函数调用出问题
题主的语法错了 verilog中,常数的表示方式为 <位宽>'<进制><数字> 其中位宽无论后面的进制是什么,均表示的是二进制的位宽。所以 1'd9等都需要改为4'd9 还有一点要提醒一下题主的是,绝绝绝大部分情况下function和task都只用在verification中,如果是拿来下板子compile的话,请尽量避免使用function...

Verilog,函数的值没有传递到调用部分,错在哪里?
用这种方式可以在模块例化时传递参数。例如:mem_burst_v2 #(.MEM_DATA_BITS(32),.ADDR_BITS(16),.LOCAL_SIZE_BITS(4)) u_mem_burst_v2 (端口连接)这样,3个parameter就被赋予了例化时给的值。

verilog中task和function的区别是什么?
function只是草稿纸,task是验证用途的。verilog中task和function的区别:module: 电路;sub-program (task, function): 电路的测试程序(test bench)module是物理电路,function只是草稿纸,task是验证用途的。完全没有任何联系。function里实现的功能,必须是电路开始工作之前就能执行运算的功能,task不能写在...

怎么用verilog实现cos,sin等三角函数
最简单的,用NCO,直接可以产生正弦波和余弦波 自己做也很简单。存一个周期的正弦波数据到ROM中(也可以存1\/4周期,新手建议还是一个周期简单些)比如1024个点,然后你用一个递增的地址去去这个ROM中的数据,出来的数据经过DA就是波形了,三角波原理类似。出来的波形频率是根据你的采样频率和你ROM中的...

西青区15864496519: verilog中的函数和任务能综合吗 -
右洪环酯: 简单的函数是可以综合的,任务一般是不可综合的.这个是有标准可以查的.

西青区15864496519: 感觉verilog语言中没有必要把函数与任务分开处理,整合成C中的函数不行? -
右洪环酯: 最好不用1. 首先verilog是硬件语言,是并行的执行方式2. C是软件语言,串行的执行方式 请楼主在学verilog时就要转变一种思维方式,verilog写成的将来都必须要成综合成电路的,如果整合在一起电路会非常臃肿,实现功率并不高,这跟C有很大的区别 一般函数和任务尽量少用,除非是testbench或运算中非用不可以的

西青区15864496519: verilog 的用户自己定义的任务是否可以综合 -
右洪环酯: 目前简单的task/function在有些综合工具里面是支持的,但有很多限制和不确定因素,因此最好不要用.task/function一般都是用来做仿真用的.你做综合就用状态机去代替这些功能,可以很好的去控制时序要求和逻辑量.

西青区15864496519: verilog中可综合的函数是不是只能是纯组合逻 -
右洪环酯: 函数不耗时,只能是组合逻辑.

西青区15864496519: verilog中的“综合”究竟是什么含义? -
右洪环酯: 通俗的来讲,“综合”就是把你用硬件描述语言描述的电路转换成实际能够实现的真实电路的过程.包括门级或者寄存器传输级甚至是开关级.综合就是把你写的rtl代码转换成对应的实际电路. 比如你写代码assign a=b&c; EDA综合工具就会去...

西青区15864496519: Verilog HDL中什么是可综合模块 -
右洪环酯: (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,...

西青区15864496519: verilog HDL中的一些系统任务
右洪环酯: verilog的task和founction是可以综合的,不过综合出来的都是组合电路,你可以把它们看成一个组合模块.initial只在仿真中有用,最初的目的是给电路中的reg变量赋初值,在verilog中,给产生激励也只能用这种模式.在system verilog中,最主要的用途就是赋初值,激励一般通过其他方式施加.还有一个,就是所有initial是并行的,用于建立几个并列的进程,在仿真中有时很有用.

西青区15864496519: verilog 怎么实现 可综合的 除法? -
右洪环酯: quartusii里面有除法器 大概叫lpm_divide 我没用过 但是猜想一定很费资源 如果你的意思是除以1到1000中的任意一个整数 不妨就采用case的方式 除1的时候就得25 000 000 除2的时候就得12 500 000 依此类推 fpga是以查找表结构实现的 我觉得这么做最节约资源 而且肯定可以在一个时钟周期内完成

西青区15864496519: verilog中 $signed 能否综合 -
右洪环酯: 不能,肯定不能的.

西青区15864496519: 关于verilog中语句可不可综合 -
右洪环酯: 特别是在testbench中应用非常普遍,也是做初始化用的 测试模块的功能时,给模块提供激励信号.initial语句是不可综合的,只是一种仿真模拟. 测试

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网