hello.c
1 | #include <stdio.h> |
现象
ivy2 也是最新的,包含 org.scala-lang#scala-library;2.11.12
正确的版本号
依然会报错!!
1 | [warn] :::::::::::::::::::::::::::::::::::::::::::::: |
原因
~/.sbt 目录可能存在旧的版本,导致问题,
解决
删除 ~/.sbt 目录,如果联网,直接重新sbt run ,会自动下载更新,否则copy 别的机子上正确的 .sbt 到home 目录下。
这是由于直接用rvgcc 编译的文件,并没有按照处理器的格式做link,因此想要正确的在处理器上运行,需要正确的link
可以参见 bootrom/link.lds 文件 :
1 | 1 SECTIONS |
rvgcc -T link.ld bootrom.S -nostdlib -static -wl,--no-gc-section -o bootrom.img
同理C代码编译的时候也需要使用正确的linkfile 文件 。
必要信息:
1 |
静态时序分析工具STA,在分析时序的时候会统一从一个点出发开始计算分析(这样才有可行性),往往是从时钟PLL出来以后开始计算
一般情况下都会设一个clock network delay 表示从PLL 到寄存器段clk的群延迟 ,理想情况下,到每个寄存器的群延迟都是一样的(时钟balance)
看一个timing报告:
1 | **************************************** |
Clock Setup Slack = Data Required Time – Data Arrival Time
Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register
Data Required = Clock Arrival Time – μtSU – Setup Uncertainty
Data Arrival Time = Launch Edge + Clock Network Delay Source Register + μtCO + Register-to-Register Delay
该Makefile可作为仿真工作脚本,参考了开源处理器蜂鸟e200的仿真环境
https://github.com/SI-RISCV/e200_opensource/blob/master/vsim/bin/run.makefile
1 | RUN_DIR := ${PWD} |
晶振分有源晶振和无源晶振,一般会产生1~200Mhz时钟频率
vco亚控振荡器,可以产生比较高的频率比如2Ghz,但是不稳定
就是为了能够产生稳定的高频时钟信号,就需要用到PLL, PLL内部会有
一个VCO 产生高频时钟,通过分频器假设得到10分频的时钟2,再拿这个时钟2
和晶振产生的100mhz基用鉴相器做比较,输出一个比较的波形后经过低通滤波,
用输出电压控制VCO的输出, 那么就能是vco输出的高频时钟得到稳定的频率,达到了
倍频的效果。
20Mhz一下的晶振基本上都是基频的器件,稳定度好,20mhz以上的晶振大多是谐波(如3次,5次谐波)
稳定度差,因此强烈建议使用低频的器件,毕竟倍频器用的pll电路需要的周边配置主要是电容,
电阻,电感,其稳定度和价格方面要远远浩宇晶体晶振器件。
如果只需要一个20mhz以内的时钟频率,完全可以不用pll,直接接晶振就够了
晶振有几个重要参数:
1,晶体元件规格书中所指定的频率,也是工程师在电路设计和元件选购时首要关注的参数。晶振常用标称频率在1~200MHz之间,比如32768Hz、8MHz、12MHz、24MHz、125MHz等,更高的输出频率也常用PLL(锁相环)将低频进行倍频至1GHz以上。我们称之为标称频率。
2,输出信号的频率不可避免会有一定的偏差,我们用频率误差(Frequency Tolerance)或频率稳定度(Frequency Stability),用单位ppm来表示,即百万分之一(parts per million)(1/106),是相对标称频率的变化量,此值越小表示精度越高。比如,12MHz晶振偏差为±20ppm,表示它的频率偏差为12×20Hz=±240Hz,即频率范围是(11999760~12000240Hz)
3,还有一个温度频差(Frequency Stability vs Temp)表示在特定温度范围内,工作频率相对于基准温度时工作频率的允许偏离,它的单位也是ppm。
4,另外,负载电容CL(Load capacitance),它是电路中跨接晶体两端的总的有效电容(不是晶振外接的匹配电容),主要影响负载谐振频率和等效负载谐振电阻,与晶体一起决定振荡器电路的工作频率,通过调整负载电容,就可以将振荡器的工作频率微调到标称值。更准确而言,无源晶体的负载电容是一项非常重要的参数,因为无源晶体属于被动元器件,所谓的被动元器件即是自身不能工作,需要外部元器件协助工作,无源晶体即是!
其中:
CS为晶体两个管脚之间的寄生电容(又名晶振静态电容或Shunt Capacitance),在晶体的规格书上可以找到具体值,一般0.2pF~8pF不等。如图二是某32.768KHz的电气参数,其寄生电容典型值是0.85pF(在表格中采用的是Co)。
CG指的是晶体振荡电路输入管脚到GND的总电容,其容值为以下三个部分的和。
既然晶振的负载电容是一个非常重要的参数,如果此项参数与外部电容匹配不正确会导致什么样的现象?晶振两端的等效电容与晶振标称的负载电容匹配不正确,晶振输出的谐振频率将与标称工作的工作频率会产生一定偏差(又称之为频偏),负载电容(load capacitance)主要影响负载谐振频率和等效负载谐振电阻,它与石英谐振器一起决定振荡器的工作频率,通过调整负载电容,一般可以将振荡器的工作频率调到标称值。应用时我们一般外接电容,便是为了使晶振两端的等效电容等于或接近负载电容,对于要求高的场合还要考虑ic输入端的对地电容,这样便可以使得晶振工作的频率达到标称频率。所以合理匹配合适的外加电容使晶振两端的等效电容等于或接近负载电容显得十分重要。
负载电容常用的标准值有12.5 pF,16 pF,20 pF,30pF,负载电容和谐振频率之间的关系不是线性的,负载电容变小时,频率偏差量变大;负载电容提高时,频率偏差减小。图3是一个晶体的负载电容和频率的误差的关系图。
例外情况:
现在有很多芯片内部已经增加了补偿电容(internal capacitance),所以在设计的时候,只需要选按照芯片datasheet推荐的负载电容值的选择晶体即可,不需要额外再加电容。但是因为实际设计的寄生电路的不确定性,最好还是预留CL1/CL2的位置。
例如:
出现:
这是由于采样的时钟tx_gen_symbol_clk 和数据信号subframe_start之间存在竞争关系导致的。
我们的设计意图是时钟tx_gen_symbol_clk应该采到subframe_start信号的后沿
有人可能会说在代码中加入延迟#1来解决,实际上不推荐这样做,还会存在两个#1的信号同样还会存在竞争。
要搞清楚产生这种问题的原因首先要了解仿真器对于时序仿真的模型。
第4级的时钟不能正常采到第3级输出的数据,但是第2级的时钟能采到第二级时钟打出来的数据(D3),
原因就是,仿真器会在寄存器输出的时候添加一个虚拟的延迟δ,虽然这个虚拟延迟我们是看不到的,
在仿真器上都是0,但是对于仿真器工作的时候,到遇到always采样事件时先要判断这个δ延迟,决定触发器的采样输出。
(当延迟相等时,clk延迟的优先级会比data延迟的优先级高,即clk1能采到D1的前沿, 也就是我们看到的数据不打拍,这跟我们的预期是不一致的,
而clk1能采不到D2的前沿,但能采到D2的后沿,这跟我们的预期一样的。这些讨论仅限于前仿,
实际器件上我们必须有时序约束来保证建立保持时间,也不会存在这样的问题。
但是硬件设计就是要保证仿真和物理器件一致。因此我们要注意这个现象。
在你的TB里时钟都由一个单独的模块产生送给DUT,不管产生多少个时钟,这些时钟保证都经历了n级分频下来的然后送入DUT,这样数据就不会出现不delay的现象。