写在前面

  1. 这个专栏的内容记录的是Verilog题库刷题过程,附带RTL\TestBench,并进行代码覆盖率收集
  2. 该题库算是一个Verilog宝藏刷题网站了,提供在线仿真环境(题库),<刷题记录>专栏,持续打卡中…

文章目录

  • 一、题目
  • (1)题目描述
  • (2) 原程序
  • 二、分析
  • 三、RTL
  • 四、Testbench
  • 五、结果分析
  • (1)TB结果
  • (2)波形图
  • (3)覆盖率

一、题目

(1)题目描述

  在某个module中包含了很多相似的连续赋值语句,请使用generate…for语句编写代码,替代该语句,要求不能改变原module的功能。使用Verilog HDL实现以上功能并编写testbench验证。


(2) 原程序

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

二、分析

1、generate语法结构

  • 定义genvar,作为generate中的循环变量。
  • generate语句中定义的for语句,必须要有begin。
  • begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。

  
2、generate:循环语句(loop)

//例子
'timescale 1 ns /1 ps
module nbic xor
#(parameter SIZE = 16)
(input  [SIZE-1 : 0] a, input  [SIZE-1 : 0] b, output [SIZE-1 : 0] y );genvar gv_i; //这这类型的变量只能在generate循环语句中使用generatefor (gv_i = o ; gv_i < SIZE ; gv_i = gv_i +1) begin : label// label用来表示generate循环的实例名称xor u_xor (y[gv_i] , a[gv_i] , b[gv_i]);//实例化后的结果如下:// label [0].u_xor (y[0] , a[0] , b[0]); // label [1].u xor (y[1] , a[1] , b[1]);// label [2],u_xor (y[2] , a[2] , b[2]);// ... ...// label [SIZE-1].u_xor (y[SIZE-1] , a[SIZE-1] , b[SIZE-2]);//实例化后的层次路径如下:// nbit xor.label [0].u_xor;//... ...//同理,还可以引用别的已经定义的module在generate语句中实例化end endgenerate
endmodule

  
3、generate:条件语句(conditional)

'timescale 1 ns /1 ps
module shift register
#(parameter BITS = 8)
( input shift_in , inpuc clk      , input resetn   ,output shift_out
);wire [BITS-1 : 0] tq;genvar gv_1; //这种类型的变量只能在generateim环语句中使用// generate-condiciona1语句实质上是将条件语句放入到generate-for结构中/*在该条件语句结构中,if语句的条件必须是静态的,这样的条件表达式必须是由常数或者参数组成,也意味着在程序运行期间保持不变*/generatefor (gv_1 =o : gv_i < BITS : gv_1 = gv_1 +1)begin : labelif (gvi == BITS-1) begin//此条件成立时, u0dffdflip_flop uodff (.d(serial_in) ,.resetn (resetn) ,.ck (clk) , .q(ta[gv_1]));endelse beginif (gv_i == 0)begin //此条件成立时, uldffdflip_flop uldff (.d(tg[gv_1 + 1]) , .resetn (resetn) , .ck (clk) , .g(serial_out));endelse begin//其他情况下, u2dffdflip_flop u2dff (.d(tq[gv_i + 1]) ,.resetn (resetn) , .ck(clk) , .q(t[gv_11));endendend
endgenerate
endmodule

generate允许对语句进行条件选择,即将条件选择加入到generate中的for循环中,只例化条件成立时对应的语句或者module。


4、generate:分支语句(case)

'timescale 1 ns /1 ps
module adder
# (parameter N =4)
(input           ci,input  [N-1 : 0] ao, input  [N-1 : 0] al,output              co,output [N-1 : 0] sum
)//注意:未定义genvar变量//根据总线的位宽,调用相应的加法器
// 参数N在调用时可以重新定义,但是该值也是静态的,因为每次调用时N都是必须确定的
//调用不同位宽的加法器是根据不同的N来决定的
generatecase (N)// 当N=1或者2时分别选用位宽为1位或2位的加法器1: adder_lbit adder1 (co , sum, ao , al , ci); // 1位的加法器2 : adder_2bie adder2 (co sum, ao, al , ci): // 2位的加法器1/默认的情况下选用位宽为N位的加法器default : adder_cla # (N) adder3 (co , sum , ao , al , ci);endcase
endgenerate
endmodule

三、RTL

module gen_for_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];
*/
genvar gv_i;generatefor(gv_i=0;gv_i<8;gv_i=gv_i+1)begin:gv_labelassign data_out[gv_i] = data_in[7-gv_i];end
endgenerateendmodule

四、Testbench

`timescale 1ps/1ps
module tb_gen_for_module;reg [7:0] data_in ;reg [7:0] data_out;/*-----------------------------------------------\--    --
\-----------------------------------------------*/
initial beginrepeat(10000)begind_case(data_in,{$random}%256);#5000 ;end
end/*-----------------------------------------------\--    --
\-----------------------------------------------*/
task d_case;output  [7:0] a;input   [7:0] b;a = b;endtask/*-----------------------------------------------\--  display  --
\-----------------------------------------------*/
always @ (data_out)beginif(data_out == {data_in[0],data_in[1],data_in[2],data_in[3],data_in[4],data_in[5],data_in[6],data_in[7]})beginendelse begin$display($realtime,", error:gv_i = ;data_in = %d;data_out = %d",data_in,data_out);end
endgen_for_module u_gen_for_module(.data_in  (data_in  ),.data_out (data_out ));initial #60000000 $finish;
initial begin$fsdbDumpfile("gen_for_module.fsdb");$fsdbDumpvars            ;$fsdbDumpMDA             ;
end
endmodule

五、结果分析

(1)TB结果

display无打印错误信息


(2)波形图

由上图可以知道,输出是输入的一个移位,使用generate-for简化代码的运行结果和原来一致。


(3)覆盖率

代码覆盖率100%


✍✍☛ 题库入口
  经过一段时间的沉淀,发现入行IC行业,自己的底子还是很差,写的文章质量参差不齐,也没能解答大家的疑问。决定还是要实打实从基础学起,由浅入深。因此决定通过补充/完善基础知识的同时,通过题库刷题不断提高自己的设计水平,题库推荐给大家(点击直达),<题库记录>栏目不定期更新,欢迎前来讨论。


作者:xlinxdu
版权:本文版权归作者所有
转载:未经作者允许,禁止转载,转载必须保留此段声明,必须在文章中给出原文连接。

VL8 使用generate_for语句简化代码相关推荐

  1. C#泛型简化代码量示例

    泛型简化代码量 下是我在项目中通过泛型来简化工作的一个Demo,记录一下: using System; using System.Collections.Generic; namespace MyCo ...

  2. java中的表达式是指_Java 表达式,语句和代码块

    我们已经理解了变量和运算符,是时间学习下表达式,语句和代码块了.我们用运算符来构建表达式,计算出一个值:而表达式是语句的核心组件:而语句又组成了代码块: Expression - 表达式 表达式是由变 ...

  3. 关于lombok插件的使用,强大的简化代码工具

    关于下载和安装lombok插件,过程特别简单,可以参考: https://blog.csdn.net/longloveqing/article/details/81539749 安装好后,下面介绍下l ...

  4. python代码该怎么简化_Python开发简化代码的六大技巧

    Python开发代码简化除了采用规范化的编程规则之外,代码编写的逻辑性和对内置规则的掌握也对其有一定的影响,以下是Python3支持的用法,合理的利用可以极大的简化代码的书写复杂度. 1. 列表推导式 ...

  5. 使用现代化 C# 语法简化代码

    使用现代化 C# 语法简化代码 Intro 最近几个版本的 C# 在语法中有很多的变化,有很多语法能够帮助我们大大简化代码复杂度,使得代码更加简洁,分享几个我觉得比较实用的可以让代码更加简洁的语法 D ...

  6. lombok 简化代码_如何编写更少,更好的代码,或Project Lombok

    lombok 简化代码 我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它. 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能 ...

  7. aop 代码_项目学生:使用AOP简化代码

    aop 代码 这是Project Student的一部分. 许多人坚信方法应适合您的编辑器窗口(例如20行),而有些人认为方法应小于此范围. 这个想法是一种方法应该做一件事,而只能做一件事. 如果它做 ...

  8. 项目学生:使用AOP简化代码

    这是Project Student的一部分. 许多人坚信方法应适合您的编辑器窗口(例如20行),而有些人则认为方法应小于此范围. 这个想法是一种方法应该做一件事,而只能做一件事. 如果它做的还不止于此 ...

  9. java三目运算符简化代码_如何使用传播运算符简化代码

    java三目运算符简化代码 by Matt Granmoe 通过Matt Granmoe 如何使用传播运算符简化代码 (How to simplify your code with the sprea ...

最新文章

  1. 智能网联技术 英文_智能网联技术是什么?有什么好推荐学习地方?
  2. SegAttnGAN: Text to Image Generation with Segmentation Attention 论文解读
  3. Vi编辑器的使用方法
  4. java汉字转化accic_Java自主学习贴
  5. PTA 1003 Emergency
  6. 多重操作系统安装全解析
  7. springboot - 应用实践(2)第一个springboot应用
  8. 成语小秀才小程序V2.0.14完整安装包+小程序前端,小程序吸粉引流源码
  9. word2vec训练维基百科中文词向量
  10. 非线性控制1.3——SPR条件、Schur补引理
  11. android bks证书生成方式
  12. mysql server mirro_Docker下安装MySQL Server镜像
  13. 通俗理解torch.distributed.barrier()工作原理
  14. threejs封装加载 .glb 格式模型,修改贴图
  15. GD32F330+DS18B20
  16. 计算机专业主要学什么?
  17. echarts 玫瑰图比例太小显示优化
  18. Java打飞机小游戏
  19. 机器人瓦力 配乐_浅析《机器人瓦力》的电影配乐
  20. centOS7上用yum安装7zip并解压文件

热门文章

  1. 思路方向:如何在移动端实现3A级画面 from《使命召唤手游》技术副总监
  2. 什么是DDoS×××?DDoS防御的11种方针详解
  3. Kafka的安全认证机制SASL/PLAINTEXT 2020.11.12
  4. 支持矢量机智能逆变器无功功率控制规则的设计
  5. 4个方法,快速提升抖音作品推荐量
  6. proxool的详细配置
  7. 高性能低延迟无线蓝牙耳机,国产高人气时尚真无线蓝牙耳机测评
  8. 【音频处理】Channel Vocoder 算法简介
  9. 2012年度盘点:那些让人喷饭的坑爹段子
  10. 本科毕业论文标准格式