我的芯片之路5

admin发布

我的芯片之路5

上回说到完成前仿

现在开始完成后仿&通过综合

  • 明确正式测试时的结构关系
我的芯片之路5

 

这个是前文提到的测试代码和SHA_ip芯片的结构关系。

而前仿一直在做与sha后仿内核。V文件一起的仿真,也就是说结构是下面这个样子的

我的芯片之路5

是一个包含关系。所以要做的是,将前仿代码中的sha_ip module 注释掉即可

我的芯片之路5

 

l 修改综合过程中的问题

版本[test]shasha16_20160823

ü 一些=/<=混合使用

在一个always模块中最好<=和=不要混用。时序信号最好用<=

Ps:使用的modelsim 10se和ISE14.7版本,用ISE综合时,所有中文注释是乱码了

另外,原来的代码如

//5454468–****

reg sign=0;

reg sign1=0;

变为了

//5454468–****reg sign=0;

reg sign1=0;

引起了很多错误,以后的//后面用英文且和代码间加一空行

版本[test]shasha18_fromISErevision_20160823

ü always@(posedge clk or rst)这句话不可综合

这句话相当于always@(posedge clk or negedge rst or posedge rst),而我所使用的FPGA没有可以3个边沿触发的寄存器可使用,最多两个。

这版本主要解决了read模块里改变always@(posedge clk or rst)这句,以及一些废端口(ISE中的warning清理)

改为always@(posedge clk or posedge rst)后波形不对,pre和sha_addr不能同时改变,造成每次read数间有一个时钟周期的数据不对

(由于pre没有及时变化)

试过的方法

1.全部改为=赋值,阻塞赋值。后来发现不是这个的问题

2.在state.v中每次read后sha_rw_b置为0,仿真后发现也不行,这个不是立刻就有效果的,有延迟

3.改为always@(posedge clk ),也不行,还是有数据毛刺(反正是没变化)

4.改为always@(posedge clk or posedge rst),同3

5.改为always@(posedge clk or posedge rst or negedge rst)可以了。不知道ISE过得去么,过不去改为always@(posedge clk or negedge rst)回来试试

或者always@(*)

(后记:这个问题解决了好长时间,其实最后也就一定程度的忽略了。。。。)

版本[test]shasha20_fromISErevision2_20160824

ü 综合时不可赋初值,比如 output reg a=1’b0;这种是不可以的

可以在always模块中,比如状态机初始state中赋初值。或者always@(negedge rst) begin

reg a=1’b0; end

在Read.v部分修改了初值转换。去除赋初值的部分,将rst为低电平触发。

发现只有always@(posedge clk or rst),即 always @ (posedge clk or posedge rst or negedge rst)

可以满足read 中addr和pre同时变化以确保数据正确。然而综合时不能同时posedge rst和negedge rst

重新利用了read_reuse端口(以前是废的),改为module read 的input,在state.v中设置为wire ,assign reuse=~reset

即重新找了个信号当~reset,当成触发条件,always @ (posedge clk or negedge rst or negedge reuse)

(后记:reuse端口为了很多功能复用过很多次,走了一些弯路,比如这个版本要解决的问题。实际上always@(posedge clk or rst),即 always @ (posedge clk or posedge rst or negedge rst)这种一般可用多个控制信号的&或异或等逻辑组合来组成一个信号的跳变然后控制)

版本[test]shasha21_fromISErevision3_20160825

这个版本是试图解决由于ISE综合时不支持三个时钟的寄存器

即 always @ (posedge clk or negedge rst or negedge reuse )这句不支持

目前的解决方法是重载一个信号,使得reset只要变化该信号(假如是xxx)即变为0,过两个延时变回1,来替代三时钟

应该是重建一个module xxx,来实现这个问题的解决

(后记:是一个解决方案,但是当时没有进行下去)

版本[test]shasha22_fromISErevision3_20160826(=[Innewroom]sha_state_renew1_20160901,搬了新的办公室重命名了)

这个版本继承21

因为每次always @ (negedge rst or negedge reuse)必须等到两个信号跳变,与预期不符合

而两个敏感信号变化不足以描述

这次是试图重开一个试图试试不用reset控制的模块read和w32be,rst只控制最开始一下。先从read开始改,看能不能行

(后记:在上面几个版本所要解决的问题其实一直也没有解决,还是有半个时钟的误差。但是测试工作仍然是不影响的,毕竟可以看波形测结果,这个问题一定程度被忽略了。

但是,认为测试芯片只是搭好环境,随手一测正不正确的当时的我实在是toosimpletoonaive了,测试结果基本不会靠谱的【毕竟高校研究所的40nm芯片,外带一些人为的原因,做这个芯片的是个研三的学长,研三当年12月tape-out的,做的很水也是人情当然。。。】)

截至目前基本可以通过综合。

下期将试图使用modelsim和ISE联合后仿。

——————————–

微博@georgeuser,一枚很可能要搞硬件的喵控的专业记录日记。

记录我所走过的路,愿我的分享能予人一些借鉴,也愿我某日再回头时能再拾起细节。