题解 | #使用函数实现数据大小端转换#

使用函数实现数据大小端转换

https://www.nowcoder.com/practice/74c0c19ad0c444959c436a049647a93c

主要是function得用法。

(1) 定义函数的语法: function <返回值的类型或范围>(函数名); <端口说明语句> <变量类型说明语句> begin <语句> end endfunction 注意 :<返回值的类型或范围>这一项是可选项 , 如缺省则返回值为一位寄存器类型数 据。

函数的调用: 函数的调用是通过将函数作为表达式中的搡作数来实现的。 其调用格 式如下: <函数名>(<表达式><,<表达式>>* )

函数通过指明函数名与输入变量进行调用。函数结束时,返回值被传递到调用处。

任务的定义。 定义任务的语法如下: task <任务名>; <端口及数据类型声明语句> <语句 1> <语句 2> <语句 n> endtask

任务的调用及变量的传递。 启动任务并传递输入、输出变量的声明语句的语法如下。 1 任务的调用: <任务名>(端口 1,端口 2,…,端口 n)

function和task的区别:

(1)函数只能与主模块共用同一个仿真时间单位, 而任务可以定义自己的仿真时间单位。

(2)任务能调用任务和函数,但是函数只能调用函数,不能调用任务;

(3)任务可以描述组合逻辑和时序逻辑,可以有时延;函数只能描述组合逻辑,仿真时延为0;

(4)任务可以没有或者有多个任何类型的输入;函数只能有input端口的输入参数,且至少输入一个参数;

(5)函数返回一个值,而任务则不返回值。

参考正点原子资料:

A:函数定义中不能包含任何时间控制语句,即任何#、@、wait等语句,任务中可以使用延迟、事件和时序控制结构;

B:函数至少有一个输入变量,不能包含任何输出和双向端口,任务可以有任意多个输入、双向和输出变量;

C:函数function有一个返回值,缺省时默认返回1 bit的reg寄存器类型数据,任务task没有返回值;

D:函数不能启动任务,但是任务能启动其他任务或函数。

加上clk,rst信号是为了使用testbench使用。

`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] changebit;
	input [3:0] data_in;
	integer i;
	begin
		for (i = 0; i < 4; i = i +1)
		begin :change 
			changebit[i] = data_in[3-i];
		end
	end
endfunction

assign c = changebit(a);
assign d = changebit(b);


endmodule

testbench

需要自行添加clk, 和rst_n端口。

`timescale 1ns/1ns
module testbench();
	reg signed [3:0] a,b;
	wire [3:0]c,d;
    reg clk;
	reg rst_n;
initial begin
	$dumpfile("out.vcd");
	$dumpvars(0,testbench);

end

function_mod dut(
	.clk(clk),
	.rst_n(rst_n),
	.a(a),
	.b(b),
	.c(c),
	.d(d)
);
initial begin
	clk = 1;
	repeat(50) #1 clk =~clk;
end
initial begin
	rst_n = 0;
	#5; rst_n =1;
end

initial begin
	a = 4;
	b = 1;
	#10;
	a = 9;
	b = 3;
	#10;
	a = 13;
	b = 13;
	#10;
	$stop;
end
endmodule

全部评论

相关推荐

02-28 17:01
门头沟学院 C++
俊朗的铁猫希望被捞:兄弟如果只想搞钱的话,你这个简历最适合的其实是辅导机构做dai写啥的真的特别赚
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务