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

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

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

函数与任务(function和task),笔试中经常会遇到选择题或者简答题,对比两者的一些特性。

1. 题目

在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。    
请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。


`timescale 1ns/1ns
module function_mod(
    input clk,
    input rst_n,
    
	input [3:0]a,
	input [3:0]b,
	
	output [3:0]c,
	output [3:0]d
);

endmodule


2. 解析

2.1 function和task使用与对比


function和task的区别:

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

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

(3)任务可以有任意多个各种类型的输入;函数只能有input端口的输入参数,且至少输入一个参数;

(4)任务可以没有返回值;函数必须有一个返回值;



2.2 function使用实例

FPGA探索者往期文章——CRC校验码的多种Verilog实现方式。


2.3 function和task相关笔试真题

解析:

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

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

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

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

 

3. 代码

`timescale 1ns/1ns
module function_mod(
    input clk,
    input rst_n,
    
	input [3:0]a,
	input [3:0]b,
	
	output [3:0]c,
	output [3:0]d
);
    
    function [3:0] begin_end;
        input [3:0] data_in;

        begin
            begin_end[0] = data_in[3];
            begin_end[1] = data_in[2];
            begin_end[2] = data_in[1];
            begin_end[3] = data_in[0];
        end 
    
    endfunction

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

endmodule

文章:HR面必问问题——如何与HR斗智斗勇

作者:FPGA探索者
链接:https://www.nowcoder.com/discuss/940841?source_id=profile_create_nctrack&channel=-1
来源:牛客网

 




全部评论
您好!请问function里能用generate for吗?
点赞 回复 分享
发布于 2022-05-02 19:47

相关推荐

不愿透露姓名的神秘牛友
07-10 11:33
点赞 评论 收藏
分享
zzzzhz:兄弟你先猛猛投简历至少三百家,能约到面试就去面。最近可以速成智能小车,智慧家居烂大街的项目,不需要自己写,只需要把里面的代码讲解看明白就行。把其中涉及到的八股文都拿出来单独背一下,我去年找工作就一个智能小车智慧家居找了10k差不多。
点赞 评论 收藏
分享
合不合适,我自己说了才算
码农索隆:hr:“真执着啊,来我公司当法人吧”
点赞 评论 收藏
分享
评论
22
4
分享

创作者周榜

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