题解 | #使用函数实现数据大小端转换#
使用函数实现数据大小端转换
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