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

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

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

使用函数实现数据大小端转换
function (函数)和 task (任务)
都是为了模块化、结构化设计,主要还是将重复性的功能封装起来方便调用。
function 
function  <返回值类型或范围>(函数名);   >>>可以对返回值类型和范围不进行定义,默认值为reg型并且位宽为1
    <端口说明语句>                                     >>>声明输入端口
    <变量类型说明语句>
    begin
    <语句>                                                   >>>begin  end中只能用reg型语句
    end
endfunction
function(其功能同之前的module模块类似)
通常是用来描述组合逻辑,是阻塞赋值“="
不能包含任何延迟,函数仿真时间为0
只含有input参数并由函数名返回一个结果(函数名就是返回值)
可以调用其他的函数(function),不可调用task

task <任务名>
    <端口及数据类型的声明语句>
    <语句1>
    <语句2>
     ...
    <语句n>
endtask
task
通常用于调试,对硬件行为级描述,不可综合。
可以包含时序控制(#延迟、wait)
可以有input、output、inout参数
可以调用其他任务或函数,优先级较高


回顾题目
让实现4bit大小位转换的功能。例如4’1101经过变换后变为4‘b1011.
本题的testbench有问题,没有考虑clk和rst_n。所以这里则根据题意写了一份答案。
首先是module部分。因为多次采用大小位转换功能,所以直接将这部分定义为一个function,可以考虑用之前的for循环进行编写。可以缩短一部分。
随后是对function的调用,考虑为时钟上升沿触发,并且异步复位。
结合以上两部分对应的module代码如下:
 function [3:0] swap;
	input [3:0] swap_num;
	integer i;
	begin
		
		for(i = 0;i < 4;i = i + 1)
		begin
			swap[i] = swap_num[3-i];
		end
	end
endfunction

reg [3:0] c_tmp,d_tmp;
always @(posedge clk or negedge rst_n)
	if(!rst_n) begin
	c_tmp <= 4'b0;
	d_tmp <= 4'b0;
	end
	else begin
	c_tmp <= swap(a);
	d_tmp <= swap(b);
	endy
运用仿真工具编写的testbech文件如下:
`timescale 1ns/1ns
module tb_function();
	reg [3:0] a,b;
	reg clk;
	reg rst_n;
	wire [3:0] c,d;
always #5 clk = !clk;
initial begin
	clk = 0;
	rst_n = 0;
	a = 4'b0000;
	b = 4'b0000;
	#5 clk = !clk;
	#10 rst_n = 1; a = 4'b0001;b = 4'b0101; 
	#30 rst_n = 1; a = 4'b1101;b = 4'b1011; 
	#100
	$finish;
end


function_mod dut(
	.a (a),
	.b (b),
	.clk (clk),
	.rst_n (rst_n),
	.c (c),
	.d (d)
);

endmodule
仿真的波形图如下





全部评论

相关推荐

首先讲三个故事,关于牛客的事件一:2024年,牛客上有一对高学历情侣,求职方向与我当时一致,都是嵌入式方向。他们恰好是我的朋友,专业能力和学历背景都很扎实,也因此拿到了不少优质offer。和很多求职者一样,他们把offer情况整理后发在平台上,本意是记录与交流,但很快引发了争议。有声音指责他们“集邮”“不释放名额”,认为这种展示本身就是一种炫耀。最终讨论失控,当事人删除内容,事件也很快被遗忘。事件二:小红书评论区,一条评价获得了不少共鸣:“感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的味道”,这条评论被水印里这个同学转发到牛客后,评论...
小型域名服务器:当看到别人比自己强的时候,即便这是对方应得的,很多人会也下意识的歪曲解构对方的意图,来消解自己在这本就不存在的比较中输掉的自信,从而平白制造出很多无谓的争论。比如你会在空余时间来写优质好文,而我回家只会暗区突围,那么我就可以作为键盘侠在这里评论你是不是XXXXXXXX。即便我自己都知道这是假的,但只要这没那么容易证伪,那么当你开始回应的时候,脏水就已经泼出去了,后面可能会有更多的人带着情绪来给我点赞,而毫不关注你写的文章内容本身是啥了。
SAGIMA牛马咖啡
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务