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。