困住整整一周了,工作进行不下去,中午偶遇导师,指导意见是有两种可能:

1.  FPGA编译器优化代码,可以考虑把综合过程中所有的warning排查一下

2.  verilog里有不可综合的语句。

又及,原有的功能模块完全正确,自己改写的不行,导师说那是自己写的时序不对,仿正确的模块看modesim里自己写的和正确的模块时序差在哪里,修改自己的。

添加各种(*keep="true"*),未果

排查所有warning,没看到会和这个问题相关

相信大神导师写的代码不会有问题

一下午加晚上各种折腾,甚至画卡诺图与非门硬写了一个bit_mask,嗯,AHB总线的HSIZE+ADDR选择屏蔽哪个字节的代码有了:

等综合的时候胡乱看modelsim,突然发现了个小毛刺:

开始怀疑写的时候没有对齐,引出hready信号加在写使能寄存器控制端,最后一遍综合,没有报希望,开始收拾桌子,打算明天再搞了,然后,生活永远比电视剧精彩,峰回路转,柳暗花明。

其实最开始分析代码的时候考虑过这个问题,还试了,只是加在了byte_mask寄存器的控制端,无效。当时也隐约考虑过这个写使能信号好可疑的样子,然后...不知道为什么没有追究下去,中间modelsim仿真看波形各种折腾两天。

想起回家时候爷爷经常叨叨我的话,现在觉得好有道理。

问题找到了,第二天用了大半个下午分析原因:

正常的总线读写时序应该是这样:

因为加了HREADY控制就好了,本来是怀疑第二拍写数据的时候数据没有准备好,那HREADY定然是低电平,像这样:

怎么分析都觉得好有道理的样子,嗯,定然是这样,由于没有用HREADY来控制写使能信号,导致寄存器在不该更新的时候更新了。可是仔细推敲,又傻了,因为mask信号是用HREADY控制的,如果数据没有准备好,mask不会变,进而写入的还是会正确。

仔细再想,觉得问题不是出在总线数据没准备好,是HREADY有效总会比其他控制信号有效到的晚,是这样:

根据verilog,写使能信号

ce_re = HSEL&HWRITE&HTRANS[]&HADDR[相应的地址]

如果在时钟上升沿,这些信号已经都有效了,就会导致不用HREADY控制的写使能寄存器比期待的提前一拍置位(写使能应该在写数据周期有效,而不应该在写地址周期有效),而此刻mask信号还在等HREADY,不会有效,从而导致写寄存器错误。

附带两个小现象也解释的通:

1.  完全相同的逻辑,m0p没有这个问题 - m0p访问指令、数据、外设都用这同一组总线,总线表示自己很忙,控制信号可能不会跑的那么快(只是这么猜测,不确定)。

2. KEIL调试的时候一个现象,对于如下代码:

*(int *)(0x40000000) = 0x12345678;
*(char *)(0x40000000) = 0x55;

如果单步调试,第二拍写入会导致0x40000000地址处其他字节都变为零0x00000055,但如果在中间塞一个访问总线的语句,比如这样:

1 *(int *)(0x40000000) = 0x12345678;
2 c0 = *(int *)(0x40000000)
3 *(char *)(0x40000000) = 0x55;

就没问题,执行完第三行,0x40000000地址处数据为0x12345655,正确写入不影响其他。又想起cm4手册里对LDR STR指令的注释:总线流水可达到一周期仿问。

因为总线流水的时候,din刚刚好保持了上一个时钟里给写进来的数据,虽然寄存器变了,但下一拍的寄存器数据是这一拍数据和寄存器的组合电路,由于mask和din的状态,保证刚好下一拍写入寄存器的数据没有变。就是这样:

数据的正确不是因为总线流水的时候写使能信号怎么了,是因为上一拍的写入数据刚好在。

modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错的更多相关文章

  1. Modelsim SE 仿真 ALTERA FPGA IP

    Modelsim SE 仿真 ALTERA FPGA IP 最近,有几个朋友问过我是不是有新版本的Modelsim altera,其原因是 Qii 升级为新版本的,但是没配套的modelsim,没办法 ...

  2. jmeter链接数据库,信息全部填写正确,运行之后没有结果

    之前遇到一个很苦恼的问题,jmeter链接数据库,数据库填写的资料全部都没有问题,在其他电脑jmeter上都可以正常链接,但是在我的电脑上运行却总是不出结果, 用mysql链接数据库也一切正常,一直找 ...

  3. 【黑金原创教程】【Modelsim】【第一章】Modelsim仿真的扫盲文

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. ModelSim仿真教程

    本文章详细介绍了怎样用ModelSim仿真Verilog,虽然只是很简单的一个二分频器的例子,但却正式小白入门所需要的. 本教程以ModelSim SE 10.4为例 1. 新建工程 file-> ...

  5. cordic算法的verilog实现及modelsim仿真

    1. 算法介绍 CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲 ...

  6. 用ModelSim仿真SDRAM操作

    之前写了两篇关于Modelsim仿真的blog,其中模块管脚的命名可能让人觉得有些奇怪,其实不然,之前的两篇内容都是为了仿真SDRAM操作做铺垫的. 由于SDRAM的仿真过程相对比较复杂,也比较繁琐. ...

  7. ModelSim仿真入门

    ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发 ...

  8. Vivado级联Modelsim仿真Re-launch问题

    前两天在群里看到有朋友说Vivado级联Modelsim仿真出现修改设计代码后重新run do文件,波形没有随着代码修改而改变,这个问题博主之前没有注意到,因为把Vivado和Modelsim级联好后 ...

  9. 每天进步一点点------ModelSim仿真Altera的ROM

    1. 在QuartusII中生成rom的初始化文件,可以是hex,也可以是mif.MIF文件的格式很简单明了,所以我一向都是用MIF. 2.下载convert_hex2ver.dll文件,conver ...

随机推荐

  1. python time模块总结

    常用函数: import time --------------------------------------------------time.time()                      ...

  2. 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治

    正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...

  3. linux 查看网卡流量:sar

    sar(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,但我们一般用来监控网卡流量 # 安装 ...

  4. what's the 跨期套利

    出自 MBA智库百科(https://wiki.mbalib.com/) 跨期套利的定义 跨期套利是套利交易中最普遍的一种,是股指期货的跨期套利(Calendar Spread Arbitrage)即 ...

  5. content_type

    1.作用 将app名称与其中表关系进行保存 在models创建表时,关联到ContentType并不会产生实际的字段 2.使用 在models中代码 from django.db import mod ...

  6. save

    docker-compose-orderer.yaml # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: ...

  7. fasttext与Linear SVC 分类测试结果

    任务:分类出优质问题与非优质问题.任务背景:用户实际与智能客服交互的时候,如果只做阈值限制,在相似问题匹配的时候(由于词的重复),依然会匹配出部分结果.如:问题为 "设置好了?", ...

  8. HTTPS流程

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取.所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议. HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL ...

  9. [Guitar self-learning] 基本乐理知识1. 度,升降记号#/b

    度:是音程上面的单位, 指每两个音程(音名)之前的音距.(就像我们说身高时的cm一样, 用来表明当时的音高.) 升记号:#   , 表明在当前的音高下, 升半个音高. 如 #3  ==  4 降记号: ...

  10. Node.JS 项目打包 JXCore

    哈哈,又回来了 当你开发完成了Node.JS项目,你应该需要打包发行吧 好,JXCore就是干这个的啦! 嗯,可能你会这样来安装 1. curl http://jxcore.com/xil.sh | ...