Function注意事项
- function只能对组合逻辑进行设计,综合得到是组合逻辑单元;
- function只有一个输出变量,其定义由function名称默认给出;
- function的名称可以包含位宽,如果没有位宽则输出变量位宽为1bit;
- function可以有多个输入变量,定义方式与模块(module)的输入变量定义类似;
- function内部逻辑操作在begin和end之间进行;
- function可以进行迭代操作;
- 其他文件的function也可以调用,调用方法见Verilog function 函数。
一个Function实例
- 主要功能:
使用Function实现了对内部RAM寄存器的读写操作。
`timescale 1ns/1ps
module ram(
input clk50M ,
input rst_n ,
input [3:0] address ,//地址
input wr_en ,//写使能
input [7:0] wr_data ,//写数据
input rd_en ,//读使能
output reg [7:0] rd_data //读数据
);
reg [7:0] reg0, reg1, reg2, reg3 ;
reg [7:0] rd_data_nex ;
//FUNCTION, reg_nex
function [7:0] reg_nex(
input [3:0] address ,
input [3:0] reg_offset ,
input wr_en ,
input [7:0] wr_data ,
input [7:0] dev_reg
);
assign reg_nex = ((address == reg_offset) && wr_en) ? wr_data : dev_reg;
endfunction
//reg0, reg1, reg2, reg3,
always @(posedge clk50M or negedge rst_n) begin
if(~rst_n) begin
reg0 <= 'd0;
reg1 <= 'd0;
reg2 <= 'd0;
reg3 <= 'd0;
rd_data <= 'd0;
end
else begin
reg0 <= reg_nex(address, 4'b0000, wr_en, wr_data, reg0);
reg1 <= reg_nex(address, 4'b0001, wr_en, wr_data, reg1);
reg2 <= reg_nex(address, 4'b0010, wr_en, wr_data, reg2);
reg3 <= reg_nex(address, 4'b0011, wr_en, wr_data, reg3);
rd_data <= rd_data_nex;
end
end
//rd_data_nex
always @(*) begin
rd_data_nex = rd_data;
if(rd_en) begin
case(1'b1)
(address == 4'b0000): rd_data_nex = reg0;
(address == 4'b0001): rd_data_nex = reg1;
(address == 4'b0010): rd_data_nex = reg2;
(address == 4'b0011): rd_data_nex = reg3;
endcase
end
end
endmodule