题目描述
在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。
请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。
程序的接口信号图如下:
使用Verilog HDL实现以上功能并编写testbench验证。
输入描述:
a,b:4bit位宽的无符号数
输出描述:
c,d:4bit位宽的无符号数
解题思路
该题很明显,就是考察function的使用方法;
在Verilog HDL中,函数的声明由关键字function开始,endfunction结束。对于函数中的语句需要用begin…end包含,即使只有一句。函数的声明模板如下:
function [range-1:0] function_name(input_declaration);
other_declaration ;
procedural_statement ;
endfunction
函数在声明时,会隐式的声明一个宽度为 range、 名字为 function_name 的寄存器变量,函数的返回值通过这个变量进行传递。当该寄存器变量没有指定位宽时,默认位宽为 1。然后进行输入变量的声明和其它声明。注意function定义的尾部需要加“;”结束。
function 是用来描述功能的函数,不是描述硬件的,不可以有时序逻辑。
funtion 中可以使用for 循环:
`timescale 1ns/1ns
module function_mod(
input [3:0]a,
input [3:0]b,
output [3:0]c,
output [3:0]d
);
function [3:0]bit_reverse(input [3:0]data);
integer i;
for(i=0;i<4;i=i+1)
begin:reverse
bit_reverse[i] = data[3-i] ;
end
endfunction
assign c = bit_reverse(a) ; //调用function
assign d = bit_reverse(b) ;
endmodule
那么function 中的for 循环与 generate ... for 有什么区别?
function 在FPGA中实现,消耗的是什么资源?