在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2461|回复: 6

[原创] wujian100开发及仿真全过程

[复制链接]
发表于 2022-6-22 19:43:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 ic_xiaosuan 于 2022-6-22 19:46 编辑

业余进行捣鼓,这个是平头哥开源的基于risc-vMCU,记录每一次捣鼓的过程和坑。虚拟机(vm)装的centos7

     1.首先在新建一个Project文件夹
     2.然后把文件下载:https://github.com/T-head-Semi/w ... =wujian100_open.git
     3.这里下载完为zip,由于我的centos7没有相关解压工具,所以我先在win下解压再压缩成tar格式。
     4.然后把wujian100_open-master.tar  复制到centos7 Project的文件夹下,这里可以采用共享文件的方式(mnt/hgfs),也可以用其他方法具体搜索引擎就能找到。

       image.png

     5.下载官方资源:[color=rgba(0, 0, 0, 0.8)][url=]RISC-V+Toolchain-V1.2.2      链接[/url]平头哥芯片开放社区(OCC) (t-head.cn)    解压文件
     6.在Project文件夹下 新建文件夹:riscv_toolchain,   把需要的工具版本解压到此文件夹下,我用到的是:riscv64-elf-x86_64
       image.png
于是文件夹目录是这样的
image.png


image.png




7.下载安装EDA工具,一款是iverilog,用于RTL文件的编译和仿真,另一款是gtkwave,用于查看仿真波形。键入命令:centos7/rhel7: sudo yum install iverilog verilator gtwave发现报错如下:No package iverilog available.No package verilator available.No package gtkwave available.8.解决办法:yum install epel-release -y,之后再去执行:centos7/rhel7: sudo yum install iverilog verilator gtwave。安装成功


image.png
 楼主| 发表于 2022-6-22 21:28:27 | 显示全部楼层
本帖最后由 ic_xiaosuan 于 2022-6-22 22:29 编辑

接下来就是启动仿真了
1. 进入 wujian100_open/tools 目录下
2. 打开setup.csh 文件,如果有vcs的license,请设置vcs相关的路径和license,这里我直接用iverilog所以不用修改。
3. 执行source setup.csh命令设置环境变量 发现报bash报错
解决办法更改成csh,键入命令查询shell:
echo $SHELL
得到:/bin/bash
更改成csh
chsh -s /bin/csh
输入密码
得到:shell changed
4.之后成功执行:source setup.csh
5.在workdir目录下执行命令‘../tools/run_case -sim_tool iverilog ../case/timer/timer_test.c'    发现报错

cannotcopy.jpg
找到run_case文件中156行的代码:!system("cp $file $wujian100_open_PATH/workdir") or die "can't copy $file";
考虑到路径问题,重新对校路径发现我的wujian100_open路径多出来-master。(QAQ:此时我有点懵了为什么我下载完会有master。)
将文件夹重命名之后,又一次执行5步骤,又是一次新的报错

873e7c281809af3cc87fe8c06f87d75.png

/bin/riscv64-unknown-elf-gcc: Command not found,也就说明了改路径设置不对,而在检测完makefile和setup.csh后发现并无错误,于是重新source setup.sch

4ff463cc692c01b5a6ef36eaf1c65d6.png

至此,wujian100 第一个仿真测试通过






发表于 2022-6-22 22:55:32 | 显示全部楼层
THANKS
发表于 2022-6-23 09:30:04 | 显示全部楼层
谢谢分享
发表于 2022-6-23 22:13:52 | 显示全部楼层
# wget http://pkgs.repoforge.org/rpmfor ... 1.el7.rf.x86_64.rpm # rpm -ivh  rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm # yum install -y p7zip
 楼主| 发表于 2022-6-24 13:54:39 | 显示全部楼层
本帖最后由 ic_xiaosuan 于 2022-6-24 14:03 编辑

接下来来看看这个测试用例分析分析,本以为很快就搞定了,结果硬肝了一晚上
1.进入到jianwu100_open/case/timer/文件夹中,我这里采用gvim
2.键入:gvim timer_test.c

1656036368152.png

可以看到程序从22行开始到26行,依次执行的是对timer1进行 关闭,设置计数,使能timer1  
这里我们在wujian100_open的doc下可以找到:wujian100_open Userguide v1.0.doc  
上述执行流程出自该指导书的2.2节中的工作流程

image.png

1. 通过写入定时器的TimerN的控制寄存器 Control reg来禁用定时器并对其操作模式进行编程。
2.加载timer N 的Load Count寄存器来配置计数。
3.通过写入TimerN Control Reg寄存器来使能定时器。

我在该指导书看到的第九页中0x50000000是TIM0的基址  
image.png
而在17页中对于TIM0的timer1的寄存器偏移地址如下

image.png

往下是对这些寄存器及其各位的描述
control reg
image.png
image.png

第一步这里需要把只把timer mode select位设置成user-define-running  其余都禁用得到0x2  所以对应测试用例的22行
接下来是load count。也就是计数的值。数值可以自由定义  其偏移地址为0,最大计数2^(32-1)
第二步 load count写的入0x400(hex)也就是1024(dec)

image.png
由于定时器时钟频率为20Mhz 所以1024*50ns=51.2ms 即该定时器51.2ms产生一次中断。(后面的仿真和测试补充说明)
第三步把control reg 写入0x3,使能定时器。
测试用例29行等待定时器中断产生,也就是 Timer1Int states寄存器为1
image.png
image.png
while等待的循环体里需要不断的去读该寄存器。
接着读Timer1_Int_clr  寄存器就能让定时器中断标志置零,否则标志位一直为1。
image.png
接下来打开仿真文件拉出波形,看看是否如此
在workdir文件夹中找到test.vcd 用GTKwave打开
在SST中的wujian100_open_tb下的x_wujian100_open_tb的 x_pdu_top的x_sub_apb0_top的x_tim0_sec_top的x_timer_top的U_TIMER0
image.png
然后拉出波形
image.png
我觉得这个三个波形应该可以说明问题了,(QAQ:这个文件时找了很久,压根不知道它包含在pdu上相反在cup找了很久,后面去翻看soc文件接下来就是在匹配框输入tim一层层翻找)
拉出波形后可以看到时钟频率,还有计数寄存器时从400开始向下减,直到0,产生定时器中断,接着过了一个时钟后就被清除了,当然还有其他寄存器和写数据过程可以查看,大家可以自行拉出来看看。至此大部分时间花在文件搜索上。(现在想来明白了这些top都是有层级关系的 比如计数,定时都在pdu我猜是produce的意思,后面就是apb  sec  timer的顺序了,当然这是我猜的具体我没找到文档说明(内心  - - !!))
由于前面翻看了一边soc文件夹的文件,大概的浏览过后,有个问题就是这个20Mhz的频率哪里来的?(真佩服自己的奇思妙想,可能跟之前有过嵌入式开发,打破砂锅问到底的思维有关系吧,哈哈,反正就是找)先翻看了tb中的tb.v因为case中只有文件没有top的文件,而在run_case中也说明了没有v文件的会调用tb中的tb.v作为top。(PS:run_case文件实在阅读起来好难,目前看懂个大概,具体细节实现的研究应该够我喝一壶了)
image.png

这里16行定义了时间步长和精度
18行到21行是tb的top函数
接下来看到25行,是比较幸福的,因为变量被定义成一个整数25,那么25ns取反一次不就是50ns也就是20Mhz了嘛
所以直接搜索该变量:CLKMUX_EHS_CLK_DURATION,找到120行
image.png
122到129行就是产生系统时钟的信号,确实是25ns 翻转一次所以时钟周期就是20Mhz
而120行的EHS应该是外部高速时钟(嵌入式中一般表示为High Speed External Clock signal(HSE))这里我想应该就是这个引脚吧
至于121行的PI soc CLK我暂时没翻到在哪里起作用 如果有找到的 麻烦告诉一下楼主谢谢!
到这里这个TIM的测试用例基本分析完毕了。


发表于 2022-7-18 05:55:28 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 05:19 , Processed in 0.028006 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表