如何使用verilog的function

1,172 views
Skip to first unread message

成电王超

unread,
Nov 20, 2008, 3:55:19 AM11/20/08
to DE2 Dev
> 我今天在使用verilog里面的function的时候遇到了问题,老是调试不正确,能帮我看一看吗?
我估计是自己对function的语法还不够了解

谢谢各位!!

> 下面是我简单的代码:
> (这个module是个带控制端的逻辑电路,完成平方、立方、阶乘运算)
> `define Square 4'd0
> `define Cube 4'd1
> `define Factorial 4'd2
> module function_test(result,opcode,in);
> output [7:0] result;
> input [7:0] in;
> input [4:0] opcode;
> always @ (opcode or in)
> result=Operation(in,opcode);
>
> function [7:0] Operation; //此函数完成平方、立方、阶乘运算
> input [7:0] source; //被操作数
> input [4:0] command; //用于选择运算种类
> reg [7:0] index; //中间变量
> always @ (command or source)
> casex(command)
> `Square: Operation=source*source;
> `Cube: Operation=source*source*source;
> `Factorial: begin
> Operation=1;
> for(index=2;index<=source;index=index+1)
> Operation=Operation*index;
> end
> default: Operation=8'bzzzz_zzzz;
> endcase
> endfunction
> endmodule

OOMusou

unread,
Nov 26, 2008, 9:38:09 PM11/26/08
to DE2 Dev
你這種寫法主要有兩個問題

1.always內不能放在function內
2.for(index=2;index<=source;index=index+1) 的source必須是定數
因為是變數的話,這個合成硬件

以下是我改的

`define Square 4'd0
`define Cube 4'd1
`define Factorial 4'd2

module Function(result,opcode,in);
output reg [7:0] result;


input [7:0] in;
input [4:0] opcode;

always@(opcode or in)
result = Operation(in, opcode);

function [7:0] Operation;
input [7:0] source;
input [4:0] command; begin

Operation = (command == `Square) ? source * source :
(command == `Cube) ? source * source *
source :
8'bzzzz_zzzz;

end
endfunction

endmodule


不過Factorial部分我還沒想出要怎麼改

> > endmodule- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

OOMusou

unread,
Nov 26, 2008, 9:40:20 PM11/26/08
to DE2 Dev
前一篇有錯字,重發一次

你這種寫法主要有兩個問題

1.always不能放在function內


2.for(index=2;index<=source;index=index+1) 的source必須是定數

因為是變數的話,這個不能合成硬件


以下是我改的


`define Square 4'd0
`define Cube 4'd1
`define Factorial 4'd2


module Function(result,opcode,in);
output reg [7:0] result;


input [7:0] in;
input [4:0] opcode;

always@(opcode or in)
result = Operation(in, opcode);


function [7:0] Operation;
input [7:0] source;
input [4:0] command; begin


Operation = (command == `Square) ? source * source :
(command == `Cube) ? source * source *
source :
8'bzzzz_zzzz;


end
endfunction


endmodule


不過Factorial部分我還沒想出要怎麼改

On 11月20日, 下午4時55分, 成电王超 <dljxcwangc...@126.com> wrote:

成电王超

unread,
Nov 27, 2008, 1:48:11 AM11/27/08
to DE2 Dev
谢谢

> > - 顯示被引用文字 -- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

OOMusou

unread,
Nov 27, 2008, 5:20:07 PM11/27/08
to DE2 Dev
關於Fractorial
我覺得只能去找近似的公式來做了
不可能如軟件的思維用for來做

在Verilog,for並不能如寫C那樣
因為Verilog是個硬件描述語言,而不是硬件程序語言,
for是用來描述硬件
如你有五個乘法器要描述,就可以用for來描述5個乘法器

但你若有n的乘法器,而n是個變數,這樣合成器就會傻眼了
畢竟FPGA的logic element或者ASIC的電晶體數目都是固定的,不可能有變數出現

dljxcwangchao

unread,
Nov 27, 2008, 10:04:24 PM11/27/08
to de2...@googlegroups.com
谢谢了,受益匪浅!!

网易免费邮,全球最大的中文免费邮箱

OOMusou

unread,
Dec 6, 2008, 3:49:27 AM12/6/08
to DE2 Dev
你上次問的n!
在Verilog 2001可以寫,而且定義是可合成的

不過可惜Quartus II 8.1目前還不能合成
你可以看看你的合成器可以合成嗎?

module Factorial (
input [3:0] iN, // 0 ~ 15
output [31:0] oRESULT // 1 * 2 * 3...* 15
);

assign oRESULT = fact(iN);

function automatic [63:0] fact (
input [31:0] n
);

if (n == 1)
fact = 1;
else
fact = n * fact(n-1);

endfunction

endmodule

On 11月28日, 上午11時04分, dljxcwangchao <dljxcwangc...@126.com> wrote:
> 谢谢了,受益匪浅!!


>
> 在2008-11-28?06:20:07,OOMusou?<oomu...@gmail.com>?写道:
>
>
>
> >關於Fractorial
> >我覺得只能去找近似的公式來做了
> >不可能如軟件的思維用for來做
>
> >在Verilog,for並不能如寫C那樣
> >因為Verilog是個硬件描述語言,而不是硬件程序語言,
> >for是用來描述硬件
> >如你有五個乘法器要描述,就可以用for來描述5個乘法器
>
> >但你若有n的乘法器,而n是個變數,這樣合成器就會傻眼了

> >畢竟FPGA的logic?element或者ASIC的電晶體數目都是固定的,不可能有變數出現
>
> >On?11月27日,?下午2時48分,?成电王超?<dljxcwangc...@126.com>?wrote:
> >>?谢谢
>
> >>?On?11月27日,?上午10時40分,?OOMusou?<oomu...@gmail.com>?wrote:
>
> >>?>?前一篇有錯字,重發一次
>
> >>?>?你這種寫法主要有兩個問題
>
> >>?>?1.always不能放在function內
> >>?>?2.for(index=2;index<=source;index=index+1)?的source必須是定數
> >>?>?因為是變數的話,這個不能合成硬件
>
> >>?>?以下是我改的
>
> >>?>?`define?Square????4'd0
> >>?>?`define?Cube??????4'd1
> >>?>?`define?Factorial?4'd2
>
> >>?>?module?Function(result,opcode,in);
> >>?>?output?reg?[7:0]?result;
> >>?>?input??[7:0]?in;
> >>?>?input??[4:0]?opcode;
>
> >>?>?always@(opcode?or?in)
> >>?>???result?=?Operation(in,?opcode);
>
> >>?>?function?[7:0]?Operation;
> >>?>?input?[7:0]?source;
> >>?>?input?[4:0]?command;?begin
>
> >>?>?Operation?=?(command?==?`Square)???source?*?source?:
> >>?>?????????????(command?==?`Cube)?????source?*?source?*
> >>?>?source?:
> >>?>?????????????8'bzzzz_zzzz;
>
> >>?>?end
> >>?>?endfunction
>
> >>?>?endmodule
>
> >>?>?不過Factorial部分我還沒想出要怎麼改
>
> >>?>?On?11月20日,?下午4時55分,?成电王超?<dljxcwangc...@126.com>?wrote:
>
> >>?>?>?>??我今天在使用verilog里面的function的时候遇到了问题,老是调试不正确,能帮我看一看吗?
>
> >>?>?>??我估计是自己对function的语法还不够了解
>
> >>?>?>??谢谢各位!!
>
> >>?>?>?>?下面是我简单的代码:
> >>?>?>?>?(这个module是个带控制端的逻辑电路,完成平方、立方、阶乘运算)
> >>?>?>?>?`define?Square????4'd0
> >>?>?>?>?`define?Cube??????4'd1
> >>?>?>?>?`define?Factorial?4'd2
> >>?>?>?>?module?function_test(result,opcode,in);
> >>?>?>?>?output?[7:0]?result;
> >>?>?>?>?input??[7:0]?in;
> >>?>?>?>?input??[4:0]?opcode;
> >>?>?>?>?always?@?(opcode?or?in)
> >>?>?>?>???result=Operation(in,opcode);
>
> >>?>?>?>?function?[7:0]?Operation;??//此函数完成平方、立方、阶乘运算
> >>?>?>?>??input?[7:0]?source;???//被操作数
> >>?>?>?>??input?[4:0]?command;??//用于选择运算种类
> >>?>?>?>??reg?[7:0]?index;??//中间变量
> >>?>?>?>?always?@?(command?or?source)
> >>?>?>?>??casex(command)
> >>?>?>?>????`Square:?????Operation=source*source;
> >>?>?>?>????`Cube:???????Operation=source*source*source;
> >>?>?>?>????`Factorial:??begin
> >>?>?>?>??????????????????Operation=1;
> >>?>?>?>??????????????????for(index=2;index<=source;index=index+1)
> >>?>?>?>????????????????????Operation=Operation*index;
> >>?>?>?>?????????????????end
> >>?>?>?>?????default:????Operation=8'bzzzz_zzzz;
> >>?>?>?>??endcase
> >>?>?>?>?endfunction
> >>?>?>?>?endmodule-?隱藏被引用文字?-
>
> >>?>?>?-?顯示被引用文字?--?隱藏被引用文字?-
>
> >>?>?-?顯示被引用文字?--?隱藏被引用文字?-
>
> >>?-?顯示被引用文字?-- 隱藏被引用文字 -
>
> - 顯示被引用文字 -

Reply all
Reply to author
Forward
0 new messages