【牛客网刷题】VL8-VL10 generate for语句、比较数大小、function的使用

news2024/12/26 12:07:16

👉 写在前面

👉 本系列博客记录牛客网刷题记录

👉 日拱一卒,功不唐捐!


目录

VL8 使用generate for语句简化代码

题目描述

输入描述

输出描述

RTL 设计

testbench 设计

仿真测试

VL9 使用子模块实现三输入数的大小比较

题目描述

输入描述

输出描述

题目分析

RTL 设计

testbench 设计

仿真测试

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

题目描述

输入描述

输出描述

RTL 设计

testbench 设计

仿真测试


VL8 使用generate for语句简化代码

题目描述

在某个module中包含了很多相似的连续赋值语句,请使用generata…for语句编写代码,替代该语句,要求不能改变原module的功能。

使用Verilog HDL实现以上功能并编写testbench验证。

module template_module( 
    input [7:0] data_in,
    output [7:0] data_out
);
    assign data_out [0] = data_in [7];
    assign data_out [1] = data_in [6];
    assign data_out [2] = data_in [5];
    assign data_out [3] = data_in [4];
    assign data_out [4] = data_in [3];
    assign data_out [5] = data_in [2];
    assign data_out [6] = data_in [1];
    assign data_out [7] = data_in [0];
endmodule

输入描述

data_in:8bit位宽的无符号数

输出描述

data_out:8bit位宽的无符号数

RTL 设计

`timescale 1ns/1ns

module gen_for_module( 
    input  [7:0]   data_in,
    output [7:0]   data_out
);

generate
	genvar i;
	for (i=0;i<8;i=i+1) begin
		assign data_out[i] = data_in[7-i];
	end
endgenerate
 
endmodule

testbench 设计

`timescale 1ns/1ns

module tb_gen_for_module();

reg   [7:0]    data_in;
wire  [7:0]    data_out;

gen_for_module inst_gen_for_module (
	.data_in(data_in), 
	.data_out(data_out)
);

initial begin
	data_in <= 8'd1;
	#10
	data_in <= 8'd2;
	#10
	data_in <= 8'd3;
	#10
	data_in <= 8'd4;
	#10
	data_in <= 8'd5;
	#10
	data_in <= 8'd6;
	#10
	data_in <= 8'd7;
	$finish;
end

//verdi     
initial begin
   $fsdbDumpfile("tb_gen_for_module.fsdb");
   $fsdbDumpvars(0);
end

endmodule

仿真测试

从仿真图可以看到,根据输入的八位宽数据,按照位倒转输出。

VL9 使用子模块实现三输入数的大小比较

题目描述

在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。

请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。

子模块的信号接口图如下:

主模块的信号接口图如下:

使用Verilog HDL实现以上功能并编写testbench验证。

输入描述

clk:系统时钟

rst_n:异步复位信号,低电平有效

a,b,c:8bit位宽的无符号数

输出描述

d:8bit位宽的无符号数,表示a,b,c中的最小值

题目分析

题目的要求是定义子模块,在顶层中例化子模块,这样的好处是可以简化代码量,因为有些功能描述是重复的。基本思路就是设计一个子模块,其作用为比较两个输出值的较小值并输出,因为在顶层中例化两次子模块即可实现三输入数据输出最小值了。

RTL 设计

将子模块和顶层模块写在同一个.v文件中。

`timescale 1ns/1ns

module main_mod(
	input           clk,
	input           rst_n,
	input  [7:0]    a,
	input  [7:0]    b,
	input  [7:0]    c,
	output [7:0]    d
);

reg   [7:0]     c_reg;
wire  [7:0]     min;

always @(posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		c_reg <= 'd0;
	end
	else begin
		c_reg <= c;
	end
end

compare_min compare_min_inst1 (
	.clk     (clk), 
	.rst_n   (rst_n), 
	.a       (a), 
	.b       (b), 
	.c       (min)
);

compare_min compare_min_inst2 (
	.clk     (clk), 
	.rst_n   (rst_n), 
	.a       (min), 
	.b       (c_reg), 
	.c       (d)
);

endmodule

module compare_min(
	input               clk,
	input               rst_n,
	input      [7:0]    a,
	input      [7:0]    b,
	output reg [7:0]    c
	);

always @(posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		c <= 8'd0;
	end
	else if (a < b) begin
		c <= a;
	end
	else begin
		c <= b;
	end
end

endmodule

testbench 设计

`timescale 1ns/1ns

module tb_main_mod();

reg            clk;
reg            rst_n;
reg  [7:0]     a;
reg  [7:0]     b;
reg  [7:0]     c;
wire [7:0]     d;

initial begin
	clk   = 'd1;
	rst_n <= 'd0;
	a     <= 'd0;
	b     <= 'd0;
	c     <= 'd0;
	#20
	rst_n <= 'd1;
	#200
	$finsih;
end

always #5  clk = ~clk;
always #10 a  <= {$random} % 9'd256;
always #10 b  <= {$random} % 9'd256;
always #10 c  <= {$random} % 9'd256;

main_mod inst_main_mod (
	.clk    (clk), 
	.rst_n  (rst_n), 
	.a      (a), 
	.b      (b), 
	.c      (c), 
	.d      (d)
);

//verdi     
initial begin
   $fsdbDumpfile("tb_main_mod.fsdb");
   $fsdbDumpvars(0);
end

endmodule

仿真测试

因为三个输入数据经过两次比较例化才得到最小值,所以最终得到的最小值数需要延后两拍输出。  

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

题目描述

在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。

请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。

程序的接口信号图如下:

使用Verilog HDL实现以上功能并编写testbench验证。

输入描述

clk:系统时钟

rst_n:异步复位信号,低电平有效

a,b:4bit位宽的无符号数

输出描述

c,d:8bit位宽的无符号数

RTL 设计

`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
);

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

function [3:0] swtich;
	input  [3:0]  x;
	integer i;
	begin
		for (i=0;i<4;i=i+1) begin
			swtich[i] = x[3-i];
		end
	end
endfunction

endmodule

testbench 设计

`timescale 1ns/1ns

module tb_function_mod();

reg             clk;
reg             rst_n;
reg   [3:0]     a;
reg   [3:0]     b;
wire  [3:0]     c;
wire  [3:0]     d;

initial begin
	clk = 'd1;
	rst_n <= 'd1;
	#50
	rst_n <= 'd0;
	#200
	$finish;
end

always #5 clk = ~clk;
always #10 a <= {$random} % 'd16;
always #10 b <= {$random} % 'd16;

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

//verdi     
initial begin
   $fsdbDumpfile("tb_function_mod.fsdb");
   $fsdbDumpvars(0);
end

endmodule

仿真测试

仿真结果正常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 程序设计入门基础】- Chapter One

目录 一、什么是 C&#xff1f; 1、概念 2、标准库 二、第一个 C 程序 1、下载 C 开发工具 2、开始下载好之后&#xff0c;我们先设置一下编码&#xff0c;解决中文注释不显示的问题。 3、下面我们就可以新建一个源代码 4、 编写完成后&#xff0c;我们就可以运行查看结果…

MyBatis:缓存机制详解

本篇内容包括&#xff1a;MyBatis 缓存机制概述、一级缓存与二级缓存的介绍、配置和具体流程。 一、MyBatis 缓存机制概述 在我们常见的 OLTP&#xff08;on-line transaction processing&#xff0c;联机事务处理&#xff09;类型的 Web 应用中&#xff0c;性能的瓶颈往往来源…

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

目录前言一、注意力机制&#xff1a;Attention二、自注意力机制&#xff1a;Self-Attention三、多头注意力机制&#xff1a;Multi-Head Self-Attention四、位置编码&#xff1a;Positional EncodingReference前言 最近在学DETR&#xff0c;看源码的时候&#xff0c;发现自己对…

【码上掘金编程挑战赛】- 前端可冲【简历加分项】

【码上掘金编程挑战赛】1.比赛报名2. 比赛介绍赛题一&#xff1a;码上游戏赛题二&#xff1a;码上创意赛题三&#xff1a;码上文言文赛题四&#xff1a;码上10243.报名4.提交作品1.比赛报名 比赛报名链接 https://juejin.cn/challenge/1?utm_source3169 2. 比赛介绍 赛题一…

Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】

Spring5入门到实战------12、使用JdbcTemplate操作数据库&#xff08;增删改查&#xff09;。具体代码讲解 【上篇】 Spring5入门到实战------13、使用JdbcTemplate操作数据库&#xff08;批量增删改&#xff09;。具体代码讲解 【下篇】 以上两篇采用的是注解开发形式xml配置…

自己动手写操作系统系列第3篇,实现时钟和键盘中断

对应labOS版本1.3 程序源码可以私聊我 picirq.h int 0x20~0x2f接收中断信号IRQ0~15&#xff0c;因为int 0x00~0x1f不能用于IRQ。 picirq.c pic0_mask0xfb即1111 1011&#xff1b;PIC1以外全部禁止。pic1_mask0xff即1111 1111&#xff1b;禁止所有中断 pic_enable函数就是将…

【Linux下安装jdk】Linux下安装jdk

Linux下安装jdk 1、-RPM安装 1.1、检查系统是否安装过jdk java -version 检查是否有安装包 rpm -qa | grep java 1.2、安装jdk 查看服务器版本: uname -a 下载jdk对应rpm包: https://www.oracle.com/java/technologies/downloads/#java8 上传安装包至任意目录下&…

用户登录权限校验 JWT【详解】

JWT &#xff08;json web token&#xff09;是当前最流行的用户登录权限校验&#xff08;用户认证鉴权&#xff09;方案。 官网 https://jwt.io/ JWT 的工作流程 客户端填写账号密码访问登录接口 login&#xff0c;将账号密码传给服务端服务端验证账号密码是否正确&#xff0c…

职言 | 校招面试有感,一个面试官的几点建议

职言&#xff1a; 最近一直在校招&#xff0c;我&#xff08;作者&#xff09;和同事说等这段时间结束&#xff0c;我不想再参与面试了&#xff0c;快面吐了。从校招开始&#xff0c;我团队前前后后陆续进了500多封学生简历&#xff0c;我经常一整天排满了面试&#xff0c;聊到…

【电子通识】芯片资料(数据手册/规格书)查询常用网站和方法

目录 1.AlldataSheet 网站&#xff08;建议使用&#xff09; 2.ICpdf 网站 3.CIC中国IC网 网站 4.datasheet&#xff08;不建议使用&#xff09; 5.半导小芯 &#xff08;建议使用&#xff09; 6.立创商城 &#xff08;建议使用&#xff09; 在做硬件的芯片选型、产品维修…

生物信息学笔记02 -- 研究的一般方法

生物信息学概述 以基因组DNA序列信息为源头&#xff0c;识别基因组序列中代表蛋白质和RNA基因的编码区&#xff0c;阐明非编码区的信息特征&#xff0c;破译隐藏在DNA序列中的遗传语言规律 生物信息学研究的内容与方法 研究主要内容 ⚫ 生物学数据的收集、存储、管理与提供 …

C++:继承

文章目录前言一、继承的概念及定义1.继承的概念2.继承的定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员总结前言 本文介绍C中的继承。 一、继承的概念及定义 1.继承的概念 继承机制是面向对象程序设计使代码可…

厨电智能化趋势下,究竟什么才是真正的“用户思维”?

文|智能相对论 作者|佘凯文 近期2022年前三季度的各项经济数据在陆续发布&#xff0c;大环境依然承压&#xff0c;各个行业都在负重前行。 厨电行业在房地产下滑、疫情反复等因素影响下&#xff0c;前三季度同样一直承受着不小的压力&#xff0c;AVC数据显示&#xff0c;202…

【面试官说实现一个顺序表,但听到要求后我沉默了】

在很多人心里&#xff0c;顺序表是数据结构最基础最简单的东西了&#xff0c;如果面试让我们手撕一道顺序表&#xff0c;相信大家心里早就乐开了花&#xff0c;但是面试官真的会出这么简单的题吗&#xff1f; 答案是&#xff1a;当然会&#xff0c;哈哈。 我们来看看面试官的要…

【精选】ARMv8/ARMv9架构入门到精通-[前言]

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 想不想一夜暴富&#xf…

python基于PHP+MySQL的高校公选课管理信息系统

随着我国教育质量提高,在校大学生的数量也在不断的增长。相对应的如何让学生根据自己的兴趣爱好进行在线选课,从而有目的的对学生进行培养,也是当前很多高校教务人员所关心的问题。能够让更多的大学生进行在线自主选课,选择自己所喜欢的课程和教师,我们开发了高校公选课管理系统…

强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》

目录一、研究内容概述二、系统目标与约束1.系统描述2.系统目标三、DQN、DDPG网络设计四、性能表征本文是对论文《Deep Reinforcement Learning for Joint Spectrum and Power Allocation in Cellular Networks》的分析&#xff0c;若需下载原文请依据前方标题搜索&#xff0c;第…

深入理解java线程池+源码解读

文章目录一.线程池简介1. 什么是线程池2. 线程池的优点3. 线程池中核心关系继承4.对线程池的理解①框架的两极调度模型②核心线程和非核心线程的本质区别二. 线程池核心概念1. 线程池核心参数2.两种常见的线程池①newCachedThreadPool②newFixedThreadPool③newSingleThreadExc…

基于STM32F469 discovery kit 开发板的开发3

目录基于STM32F469 discovery kit 开发板的开发3软件项目架构1. 应用层&#xff1a;2. Drivers层3. Middlewares层软件工作流程main函数入口LED等初始化配置外部中断基于STM32F469 discovery kit 开发板的开发3 前文我们已经实现了第一个例程在discovery 开发板上的运行&#…

virtio机制简介

What is VirtIO VirtIO是virtual input & output的缩写&#xff0c;是在host device之上的一层抽象层&#xff0c;提供给虚拟机使用。VM虚机一般是通过virtio device来使用host devices设备的&#xff0c;所以一个VirtIO device的主要作用其实就是充当VM与host device har…