verilog函数使用
- 格式:pdf
- 大小:175.78 KB
- 文档页数:3
Verilog函数使用
‐‐‐‐‐‐‐‐‐自定义函数
练习:设计一个带控制端的逻辑运算电路,分别完成正整数的平方、立方和阶乘的运算。
编写测试模块,并给出仿真波形。
目的:学习verilog自定义函数的调用。
Verilog自定义函数练习
解:设输入端口a,en_n,clk,rst。
输出端口result1(squar),result2(cube),result3(factorial)。
`timescale 1ns/1ns
module funtest(result1,result2,result3,a,clk,en_n,rst);
output[31:0] result1,result2,result3;
input[3:0] a;
input clk,en_n,rst;
reg[31:0] result1,result2,result3;
always@(posedge clk)
begin
if(!rst)
begin
result1=0;
result2=0;
result3=0;
end
else
if(!en_n)
begin
result1=squar(a);
result2=cube(a);
result3=factorial(a);
end
end
function [31:0] squar;
input [3:0] opa;
begin
squar=opa*opa;
end
endfunction
function [31:0] cube;
input [3:0] opa;
begin
cube=opa*opa*opa;
end
endfunction
function[31:0] factorial;
input[3:0] opa;
reg[3:0] i;
begin
factorial=opa?1:0;
for(i=2;i<=opa;i=i+1)
factorial=i* factorial;
end
endfunction
endmodule
由于for(i=2;i<=opa;i=i+1)中,for循环用了变量opa,所以quartus ii不能综合。
但是不影响测试程序。
Testbench
`timescale 1ps/1ps
module fun_tp();
reg[3:0] n,i;
reg reset,clk,en_n;
wire[31:0] result1;
wire[31:0] result2;
wire[31:0] result3;
initial
begin
n=0;
reset=1;
clk=0;
#50 reset=0;
#50 reset=1;
en_n=0;
for(i=0;i<=15;i=i+1)
begin
#100 n=i;
end
#1000 $stop;
end
always #50 clk=~clk;
funtest funtest1(.result1(result1),.result2(result2),.result3(result3),.a(n),
.clk(clk),.en_n(en_n),.rst(reset));
endmodule
输出波形
Author: Apple Cai
Data: 31 Aug 2010。