verilog仿真技巧与bug集合

news2024/9/25 11:11:34

文章目录

    • 赋值语句
    • 想法
    • 一些建议
      • 时钟信号
      • 关于异步fifo
        • 写入数据时wp+1,读出数据时rp+1
    • 一些自己的bug
      • 关于操作符&
      • 关于if-else
    • 关于modelsim使用

1.初学者不建议在设计文件中加入仿真语句;
2.初学者也不会在tb里使用类似always一样的设计。

对于1.因为把仿真通过的HDL修改为可以综合下板的HDL是很难的一件事,但是适当的使用预编译ifdef来控制何时使用仿真语句,这样可以在设计文件需要综合时忽略仿真语句。在设计文件中使用仿真语句虽有风险,但是可以提现一个人的HDL能力(设计文件里加上initial真的很爽,很方便)
对于2.,使用的always设计通常是为了模拟某种时序而进行的描述,一般初学者只是使用initial,task来产生激励。

以前我也以为assign只能描述wire类型。但实际上也可以描述reg类型(还可以放always块里),还有deassign。
always 除了可以产生仿真的时钟,也可以 always #1 a = b;还可以做很多仿真的模拟时序协议的东西。

而initial除了简单的激励,还有task,repeat(重复多少次),wait(电平触发),@(边沿触发)可以用。多使用display、monitor,time,stop,finish,和写入文件的fopen,fdisplay,fclose,fwrite,fscanf,能提高很多仿真效率。

赋值语句

含延时的赋值语句

想法

always@()
case(a)
	0: assign b=c;

在实例化的时候接口可以用逻辑计算

.en( ~a & (b | c) )
wire[64*64+8*8+8 : 0] full;

generate for...
    always  #rd_period clkr[rd_period] = ~clkr[rd_period];//控制读周期,不可综合
    for...//0-7
        for...//0-7
	    例化模块
	    .clk( clkr[rd_period] ),
	    .full  ( full[64*rd_period + 8*wr_i+rd_i]     )//使得有一个特定的full信号连到例化的模块接口上。

这里声明一下上述的特定信号,应该是64 = 8*7+7+1这样推算出来的。
而不是64= 8*8。曾经花了一个半小时来debug找出来。。

一些建议

时钟信号

  1. 10M~1000M的信号用PLL生成(MMCM)比较好,往下的就手动分频(因为pll生成的5M时钟实际上可能只有4.125M )。

  2. 对于1.中生成时钟也可以使用create_clock的tcl指令来创建分频时钟。
    在这里插入图片描述

  3. 一个变量要得到时钟信号(或者分频),一定要用wire,assign
    assign clkr[9:0] = { 10 {clk_4M} };
    assign clkw = clk_20M;
    如果用了电平触发/边沿触发,这个变量会有一个相位延迟(就是触发时钟的一个周期)。注意,即使是电平触发也有延迟,always@(*)里描述的组合逻辑不等效于assign描述的组合逻辑.

关于异步fifo

写入数据时wp+1,读出数据时rp+1

如果读写是7bit深度(而fifo只有6bit,扩展1bit作为指针)。这里rp,wp都是因为读/写使能然后+1的(有些指针是统一操作一个指针,写就+1,读就-1)
rp=0,wp=127是不存在的。wp此时最多=64=7’b100_0000,rp=0=7’b000_0000。表示写满。
rp=127,wp=0是存在的。但是empty=0。这个要看具体的厂家对fifo的时序控制了。在本例里,wp=0是写了两圈数据,在第三圈一个数据都没有写入。读时钟上升沿,rp=127之后跳变到0,此时读出第二圈最后一个数据,这时候数据被读完empty=1。因此这种情况下,rp=wp=0才表示empty。

所以这种情况只能考虑 读写指针相同 empty=1;读写指针最高位不同,其余相同,full=1;不必也不能考虑指针一个最大一个为0的情况。

一些自己的bug

关于操作符&

  1. c= a & b ,ab相同但是c未必为1。因为0 & 0 =0。数电忘得干干净净。
  2. wire [3:0] a = 4’b1101;
    wire b = 1’b1;
    wire c = a & b;
    猜猜结果是啥,c=1’b1(默认c=a[0]&b[0])。在多比特和单比特 位与 的时候,要特别小心,两个数不同也能得到“相同”这个结果。

关于if-else

if
	if
else

上面的代码会被认为是

if
 	if
	else

正确的应该是:

if	begin
	if
end
else

关于modelsim使用

使用do脚本可以提高很多效率。在使用generate for来例化模块时,抓信号是非常头疼的。但是我们可以先抓一次想看的信号,保存为do脚本,然后将这段脚本剪切到其他空文件里,ctrl+H将genvar的变量直接替换:
在这里插入图片描述

这样就超级快得到了下一组想要抓的变量,而不必手动去抓信号。

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

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

相关文章

国产RISC-V处理器“黑马”跑分曝光!超过多数国内主流高性能处理器!

来源企业投稿 2010年,开源、开放、精简的RISC-V架构诞生。虽然距今仅有12年,但RISC-V迎来了众多玩家的积极参与,其技术、生态、应用都快速发展。在许多秉持匠心的技术人员的耕耘下,RISC-V也早已从传统强项物联网走出,…

error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type

文章目录1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type2、解决办法3、uint8_t此类数据类型补充4、码字不易,点点赞1、报错error: ‘uint8_t’,‘uint16_t’ ,‘uint32_t’ does not name a type 在网络编程PING程序时遇到的小bug&am…

【BUUCTF】MISC(第二页wp)

文章目录被劫持的神秘礼物刷新过的图片[BJDCTF2020]认真你就输了[BJDCTF2020]藏藏藏被偷走的文件snake[GXYCTF2019]佛系青年[BJDCTF2020]你猜我是个啥秘密文件菜刀666[BJDCTF2020]just_a_rar[BJDCTF2020]鸡你太美[BJDCTF2020]一叶障目[SWPU2019]神奇的二维码梅花香之苦寒来[BJD…

day02-Java基础语法

day02 - Java基础语法 1 类型转换 在Java中,一些数据类型之间是可以相互转换的。分为两种情况:自动类型转换和强制类型转换。 1.1 隐式转换(理解) ​ 把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的&am…

外贸小白适合哪种邮箱?

除了一些企业指定的邮箱,大多数外贸人,尤其是小白的外贸人,都希望选择最合适的邮箱,赢在起跑线上。判断邮箱质量的两个主要因素是投递率和安全性。米贸搜的排列如下: 公共个人邮箱 此时常见的个人邮箱有国外的gmail、hotmail、雅…

2023 年软件开发人员可以学习的 10 个框架

开发者您好,我们现在处于 2023 年的第一周,你们中的许多人可能已经制定了 2023 年要学习什么的目标,但如果您还没有,那么您来对地方了。 早些时候,我分享了成为Java 开发人员、DevOps 工程师、React 开发人员和Web 开…

联合分析案全流程分析

联合分析(conjoint analysis)是一种研究消费者产品选择偏好情况的多元统计分析方法。比如消费者对于手机产品的偏好,对于电脑产品的偏好,也或者消费者对于汽车产品的偏好情况等。联合分析中涉及几个专业术语名词,分别如下所述: 联…

基于深度学习下的稳定学习究竟是什么?因果学习?迁移学习?之一

机器学习 | 稳定学习 | DGBR 深度学习 | 迁移学习 | 因果学习 众所周知,深度学习研究是机器学习领域中一个重要研究方向,主要采用数据分析、数据挖掘、高性能计算等技术,其对服务器的要求极其严格,传统的风冷散热方式已经不足以满…

C++---智能指针

目录 1. 为什么需要智能指针? 2. 内存泄漏 2.1 什么是内存泄漏,内存泄漏的危害 2.2 内存泄漏分类 2.4如何避免内存泄漏 3.智能指针的使用及原理 3.1 RAII 3.2 智能指针的原理 3.3 std::auto_ptr 3.4 std::unique_ptr 3.5 std::shared_ptr 3.6…

使用RMAN传输数据_创建可传输的表空间集(Creating Transportable Tablespace Sets)

传输数据比对相同的数据执行export/import或unload/load操作更快。因为对于用户定义的表空间,数据文件包含所有拷贝到目标位置的实际数据,你使用Data Pump只传输数据库对象的元数据到新数据库。 本章阐述如何使用RMAN通过还原备份来创建可传输的表空间集…

Dockfile是什么

目录 1. Dockfile是什么 2. Dockerfile的基本组成 2.1 FROM 2.2 MAINTAINER 2.3 RUN 2.4 COPY 2.5 ADD 2.6 EXPOSE 2.7 WORKDIR 2.8 ONBUILD 2.9 USER 2.10 VOLUME 2.11 CMD 2.12 ENTRYPOINT 3. dockerfile示例 3.1 准备 3.2 将该目录上传至linux 3.3 构建镜像…

2022年「博客之星」参赛博主:一个处女座的测试

我正在参加年度博客之星评选,请大家帮我投票打分,您的每一分都是对我的支持与鼓励。 五星必回,诚信互评,(如果)今日已满,明天必回,言出必行,感谢支持! 我正在…

【深度探讨】数据存储进化论,区块链才是未来

发表时间:2022年5月23日 信息来源:bsvblockchain.org 需要一个适于处理这种日渐普及的资源的基础设施。 2022年2月,在沙特愿景2030区块链峰会上,BSV区块链协会创始主席Jimmy Nguyen就数据的价值这一话题发表了一场令人叹为观止的…

nodejs+vue+element+eachers构建开源项目大型连续剧(2)安装mysql数据库,在nodejs服务器中操作数据库数据

太长时间没更新了,然后,理由是什么呢?是因为阳了,真没想到,吃嘛嘛香的我忽然阳了,果然阳的初期症状就是嘴硬。然后,开始我们连续剧的第二集。 一、进行mysql的安装 学习第一步,从安…

[极客大挑战 2019]BuyFlag1(BUUCTF)

前言: 这篇文章还是是为了帮助一些 像我这样的菜鸟 找到简单的题解 题目描述 解题工具: 我爱用edit this cookie2和hackerbar, 当然也可以burpsuite和fiddler抓包 解题过程: 看到他说flag要100000000 MONEY, 还要是Cuits students, …

GCC嵌入汇编特性

前言 在C语言编程中,使用汇编指令有两种方式,一种是使用单独的汇编源文件,在最后编译的时候和其它C工程文件编译到一起,这种方式能够做到汇编函数和C函数的互相调用,但是如果希望在C语言中直接调用汇编表达式就不是那…

kibana在linux环境安装实战遇到的问题汇总

kibana在linux环境安装实战遇到的问题汇总: 1、找不到主节点的错误: savedobjects-service] Unable to connect to Elasticsearch. Error: [master_not_discovered_exception] null 原因是找不到es的主节点,意思是es没有配置主节点。 解决…

【Spring】Spring @Cacheable 官方学习及demo

文章目录前言Cacheable 的来源应用场景集成Redis的思路代码及验证后记前言 Spring 有很多声明式的编程风格,Transactional 是,Cacheable 也是。说起 Transactional,复杂的事务情况下,这个注解也有局限,需要用到编程式…

奇安信病毒检测中心 2022年第二季度App收集个人信息检测报告 学习笔记 附下载地址

奇安信 2022年第二季度App收集个人信息检测报告 下载地址 2022年第二季度 APP收集个人信息 检测报告 奇安信 病毒响应中心 研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备,其中各式各样的APP更是丰富了人们的生活,从社交…

现在考系统集成项目管理工程师有用吗?

有用! 现在考系统集成项目管理工程师还是挺有用的哈,虽然它资质评定国务院取消了,但它是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试,并且是职业资格考试、职称资格考试和水平考试。 系统集成项目管理工程师…