riscv的编译环境要怎么安装和用起来?请坛友分享一下使用技巧
在fpga上跑riscv,需要安装编译环境,github上的readme写的太简单了,根本就执行不下去网上找了几篇blog比着试,发现也是各种报错
这东西太麻烦了,又要linux,又要各种命令行,搞半天工具都装不上
有没有win下ide环境可以用呢,请坛友分享一下riscv的使用技巧
感谢!
https://github.com/riscv-collab/riscv-gnu-toolchain 放弃吧! 为什么跑RISCV 初音之恋 发表于 2024-6-4 11:22
为什么跑RISCV
(引用自3楼)
一个开源的参考设计,里面用了riscv,想跑起来试试 Nuker 发表于 2024-6-4 11:18
放弃吧!
(引用自2楼)
为啥劝退?被坑过吗{:titter:} ide是标准linux。eclipse可以直接用。
编译器自己找riscv toolchain,git下来然后慢慢build,很详细。
系统的话可能不太好搞,你试试buildroot,我没有折腾。不跑系统的话随意。
fpga上面有vexriscv,可以直接例化soc练手,熟练了可以自己用核搭soc。
想省rom,gcc需要自己改一下floatunsisf,floatundisf等几个api,libgcc转换先double再float,要多几百字节。 smbxfdbz 发表于 2024-6-4 11:52
为啥劝退?被坑过吗
(引用自5楼)
开源的东西是需要花时间、沉下心去搞清楚的,首先搞清楚你用的开源核的ISA配置,再去找对应的工具链,如果相用IDE,可以尝试segger的,另外,Quartus现在也直接内置了RV的工具链 docker 很简单,唯一要解决科学上网 https://gitee.com/liangkangnan/tinyriscv
参考这里的4.1和4.4 smbxfdbz 发表于 2024-6-4 11:52
为啥劝退?被坑过吗
(引用自5楼)
开源核的名称是什么?最好用它指定的编译好的toolchain,省去很多踩坑过程 wye11083 发表于 2024-6-4 12:00
ide是标准linux。eclipse可以直接用。
编译器自己找riscv toolchain,git下来然后慢慢build,很详细。
(引用自6楼)
请教大神,这个有没有widows下能直接编译调试的那种IDE? smbxfdbz 发表于 2024-6-4 16:14
请教大神,这个有没有widows下能直接编译调试的那种IDE?
(引用自11楼)
调试的话你得研究openocd,我没折腾过。都是在win上编译仿真测试之后丢板子上。 wye11083 发表于 2024-6-4 18:45
调试的话你得研究openocd,我没折腾过。都是在win上编译仿真测试之后丢板子上。 ...
(引用自12楼)
在win上编译一般用什么工具,怎么搭建坏境? smbxfdbz 发表于 2024-6-4 19:04
在win上编译一般用什么工具,怎么搭建坏境?
(引用自13楼)
我用wsl+makefile。你得自己找。 本帖最后由 snowy 于 2024-6-4 21:55 编辑
smbxfdbz 发表于 2024-6-4 16:14
请教大神,这个有没有widows下能直接编译调试的那种IDE?
(引用自11楼)
Embedded Studio for RISC-V wye11083 发表于 2024-6-4 19:40
我用wsl+makefile。你得自己找。
(引用自14楼)
大神,再向你请教个问题,riscv编译工具链我装好了,编译简单的测试代码也正常
但是我编译一个开源代码时,里面用到了类似下面这种代码,编译会报错:test.c:3: Error: unrecognized opcode `csrr t0,misa', extension `zicsr' required
int main(int argc, char *argv[])
{
asm volatile ("csrr t0, misa");
return 0;
}
github上有人探讨这个问题,但是我这方面水平太菜,没看明白怎么弄,能帮忙看下怎么处理这个问题吗?感谢!
https://github.com/riscv-collab/riscv-gnu-toolchain/issues/1262
wye11083 发表于 2024-6-4 19:40
我用wsl+makefile。你得自己找。
(引用自14楼)
刚测试添加 -march=rv32im_zicsr,测试代码可以编译通过
riscv32-unknown-elf-gcc -march=rv32im_zicsr test.c -o test.exe
但是那个开源设计,用cmake+make编译的,如何把 -march=rv32im_zicsr这个配置传进make里呢? smbxfdbz 发表于 2024-6-8 11:00
大神,再向你请教个问题,riscv编译工具链我装好了,编译简单的测试代码也正常
但是我编译一个开源代码时 ...
(引用自16楼)
没遇到你说的问题,你装的gcc版本太老了吧,或者是llvm。从源码编译的不存在这个问题。csrr/csrw/csrwi都是非常常规的操作,只要你核带csr模块就是标准读写。
想要编译后体积小,建议11.1。新版本编译后反而大了。
cmake不知道怎么用,你得上网查。
编译gcc时一定要传入正确的--with-arch和--with-abi,否则gcc用的库不一定是正确的。即,rv32g编译rv32em程序是有可能不工作的。 riscv可以参考沁恒的开发环境 vscode +plaoformio wye11083 发表于 2024-6-8 11:23
没遇到你说的问题,你装的gcc版本太老了吧,或者是llvm。从源码编译的不存在这个问题。csrr/csrw/csrwi都 ...
(引用自18楼)
我用的是13.2,已经是最新的了
如何安装旧版本的呢?github是有编译好的文件,但是--with-arch= --with-abi=参数不对,如果想修改话这两个参数的话,是不是只能自己重新编译?
如何clone旧版本的代吗呢?
smbxfdbz 发表于 2024-6-9 09:59
我用的是13.2,已经是最新的了
如何安装旧版本的呢?github是有编译好的文件,但是--with-arch= --with-a ...
(引用自21楼)
那你就用13.2,重新编译。riscv toolchain有详细说明。 wye11083 发表于 2024-6-9 10:14
那你就用13.2,重新编译。riscv toolchain有详细说明。
(引用自22楼)
我重新编译过13.2,--with-arch --with-abi都是对的,但就是用他编译我要用的那个开源工程时,csr指令报错
用github release的11.1版本可以编译csr,但编译提示can't link soft-float modules with double-float modules,感觉是--with-abi不对
所以我想修改一下--with-abi,重新编译11.1,大神能否提示一下,编译旧版本的toolchain,如何操作?
我直接下载releases目录下的source code尝试编译,但里面的目录基本上都是空的,根本编译不了,提示:did not match any file(s) known to git
smbxfdbz 发表于 2024-6-9 10:27
我重新编译过13.2,--with-arch --with-abi都是对的,但就是用他编译我要用的那个开源工程时,csr指令报错 ...
(引用自23楼)
编译脚本也要加上正确的-mabi-march wye11083 发表于 2024-6-9 13:04
编译脚本也要加上正确的-mabi-march
(引用自24楼)
我找到个方法,用checkout可以检出历史版本
历史版本很多,随便找了个21年的,编译出来是10.2,用这个版本编译那个开源代码,确实能编译成功。
但我有个疑问,不同版本的toolchain编译出来的执行文件是否通用呢?会不会开发者调试时用的新版本,而使用者用老版本,导致编译出来的执行文件运行不了?
smbxfdbz 发表于 2024-6-9 16:43
我找到个方法,用checkout可以检出历史版本
历史版本很多,随便找了个21年的,编译出来是10.2,用这个版 ...
(引用自25楼)
有可能的。尽量用较新版本。不过目前riscv全都是碎片化,各家都有各自的魔改,所以基本不存在你说的情况。 win下最简单的就是segger embedded studio了,然后调试直接用jlink。 wye11083 发表于 2024-6-9 17:09
有可能的。尽量用较新版本。不过目前riscv全都是碎片化,各家都有各自的魔改,所以基本不存在你说的情况 ...
(引用自26楼)
大神,再请教点问题,这个开源设计我翻了一遍所有代码,没有网表,也没有封装起来的库文件,开源的很彻底
我本来以为他是完全免费的,后来发邮件问,回复说是要收费25000欧元的,开源的代码仅用于评估,工作一小时候后,会停止工作
我的问题就是,既然开源了所有代码,他怎么限止只能工作1小时呢?是赌用户找不到这个一小时限止在代码的那个地方吗?还是有什么其他的方法限止工作时间?
帮忙指点一下实现思路吧
smbxfdbz 发表于 2024-6-13 17:23
大神,再请教点问题,这个开源设计我翻了一遍所有代码,没有网表,也没有封装起来的库文件,开源的很彻底 ...
(引用自28楼)
??一小时之后不能用了? 这不太好办,其它部分能工作么?其它部分能工作就检查信号,否则芯片被保护了。 本帖最后由 smbxfdbz 于 2024-6-13 17:41 编辑
wye11083 发表于 2024-6-13 17:31
??一小时之后不能用了? 这不太好办,其它部分能工作么?其它部分能工作就检查信号,否则芯片被保护了 ...
(引用自29楼)
和芯片没关系,他是跑在FPGA上的
我感觉一定是要在代码里控制的,可既然开源了代码,那不是代码改一下就绕过lecense了吗?是不是作者觉得别人找不到?还是有其他方法控制呢 smbxfdbz 发表于 2024-6-13 17:40
和芯片没关系,他是跑在FPGA上的
我感觉一定是要在代码里控制的,可既然开源了代码,那不是代码改一下就 ...
(引用自30楼)
你测过1个小时后会挂掉? wye11083 发表于 2024-6-13 20:42
你测过1个小时后会挂掉?
(引用自31楼)
我还没测,要做板子才能测,我只是发邮件问了一下作者,他说只能工作一小时 smbxfdbz 发表于 2024-6-13 20:57
我还没测,要做板子才能测,我只是发邮件问了一下作者,他说只能工作一小时 ...
(引用自32楼)
。。。开源的应该没限制。商业版本有限制。 wye11083 发表于 2024-6-13 22:10
。。。开源的应该没限制。商业版本有限制。
(引用自33楼)
作者的回复是:The open source IP-core on GitHub can be used for evaluation and demo purposes. The IP-core will stop operating after 1 hour.
If the DP IP-core is used in a commercial project, then a license is required.
应该就是在代码里加了逻辑控制,商用一般没人会尝试破解,毕竟会有各种技术风险 smbxfdbz 发表于 2024-6-14 09:45
作者的回复是:The open source IP-core on GitHub can be used for evaluation and demo purposes. The...
(引用自34楼)
他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:
DisplayPort-main.zip\DisplayPort-main\software\src\lib\
这里面有几个ram/rom文件,这个是通过主SOC下载进从SOC里面的(估计有3个RISCV)。这两个是没有给源码的,估计license是另外下载进去的。 wye11083 发表于 2024-6-15 13:53
他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:
DisplayPort-main.zip\DisplayPort-mai ...
(引用自35楼)
是的,应该是在这里封闭了部分源码
我是需要实现edp1.4 ip的一收两发,要放进封装厚度小于1mm的芯片,找了一圈只找到AU15P以下的型号参数合适封装也合适,但这个资源远放不下官方edp IP。所以我就尝试找其他IP方案。有家方案商过来聊了一下,说是他们从新思采购的IP,当时花了100万美金,用了一年才消化用起来。帮我出方案,就要找新思裁剪IP,才能放进AU15P以下的型号,给我预估了200万费用,可以承诺搞不定退款。
我的疑问就是,搞定这个事情真的要这么多钱吗?大神能否给点方案选型建议 smbxfdbz 发表于 2024-6-16 09:36
是的,应该是在这里封闭了部分源码
我是需要实现edp1.4 ip的一收两发,要放进封装厚度小于1mm的芯片,找 ...
(引用自36楼)
??一收两发直接复制显示?如果只是这个简单的需求,你需要做几件事情:
(1)打通aux通道。建议的话可以考虑做个aux中继,或者直接把aux连到后端输出接口,这样foga就不用对付aux了(aux接口协议非常麻烦,几百个api)。
(2)打通serdes的drp通道,可以动态配置速率(非常关键)。如果显示器分辨率/帧率是固定的,理论上可以写死。
(3)serdes直接透传,不做协议解析。做解析就非常复杂了,拆包,解包,聚合,重组,链路管理,。。,etc。最简单的就是,clk使用rxclk,然后rxd直接给txd。这里可能存在一些稳定性风险,因此还是建议做一些最基本的工作,比如检测any sop重同步再转发,这样可以在中间插入idle而不至于丢数据。这样是不需要解包的,只需要一个同步器。
如果还需要对付分辨率切换,就麻烦了。如果链路速率变化,则fpga肯定会出问题。 wye11083 发表于 2024-6-16 13:49
??一收两发直接复制显示?如果只是这个简单的需求,你需要做几件事情:
(1)打通aux通道。建议的话可 ...
(引用自37楼)
输入的帧率要切换,类似显示器有60hz 120hz之类的,输出帧率与输入同步。这种场景分辨率和lane速率应该是不变的,但我不想自己做ip,很麻烦,而且也担心健壮性。搞定这类ip需要几百万这么多吗? smbxfdbz 发表于 2024-6-16 15:16
输入的帧率要切换,类似显示器有60hz 120hz之类的,输出帧率与输入同步。这种场景分辨率和lane速率应该是 ...
(引用自38楼)
商用级ip 百万$非常正常。
所以不想花钱就自己搞定速率切换,然后直接转发就行了。 wye11083 发表于 2024-6-16 15:36
商用级ip 百万$非常正常。
所以不想花钱就自己搞定速率切换,然后直接转发就行了。 ...
(引用自39楼)
这个我感觉也就你这样的大神有能力自己做,我是没把握自己做,也不敢让公司的fpga工程做,健壮性与开发周期都不可控,只能想办法找商用IP资源。如果行情就是几百万,那也没办法,研发不是闭门造车,该花的省不了。 smbxfdbz 发表于 2024-6-17 08:27
这个我感觉也就你这样的大神有能力自己做,我是没把握自己做,也不敢让公司的fpga工程做,健壮性与开发周 ...
(引用自40楼)
你这做个纯bridge还好吧{:lol:} wye11083 发表于 2024-6-15 13:53
他这套硬件应该是完整的。固件里面做了限制。注意看这几个文件:
DisplayPort-main.zip\DisplayPort-mai ...
(引用自35楼)
抱着学习的心态,我在看parretto的开源代码,他在PL里只例化了一个riscv cpu呀,没有例化多个cpu
而且我看lib文件夹下的ram和rom数据,是初始化时在下面这个函数里使用的
他这个初始化过程是遍历lib下的一个rom数组,然循环赋值给dp->dev->mem
// DP Initialize rom
void prt_dp_rom_init (prt_dp_ds_struct *dp, uint32_t len, uint8_t *rom)
{
uint32_t dat;
// Start initialization
dp->dev->ctl = PRT_DP_CTL_MEM_STR;
for (int word = 0; word < (len/4)+1; word++)
{
for (int byte = 3; byte >= 0; byte--)
{
dat <<= 8;
dat |= rom[(word * 4) + byte];
}
dp->dev->mem = dat;
}
}
dp->dev->mem其实只是prt_dp_ds_struct结构体里的prt_dp_dev_struct结构体里的一个成员变量,上面这个循环的结果好像只是把rom的最后四个字节赋值给dp->dev->mem,感觉完成是无效操作
这里完全没理解是个什么操作原理,大神能帮忙再解下疑吗?
// Device structure
typedef struct {
uint32_t ctl; // Control
uint32_t sta; // Status
uint32_t mail_out; // Mail out (pm -> host)
uint32_t mail_in; // Mail in (host -> pm)
uint32_t aux; // AUX
uint32_t mem; // Memory update
} prt_dp_dev_struct;
// Data structure
typedef struct {
uint8_t id;
volatile prt_dp_dev_struct *dev; // Device
prt_dp_mail_ds_struct mail_in; // Mail in
prt_dp_mail_ds_struct mail_out; // Mail out
volatile prt_dp_debug_struct debug; // Debug
volatile uint32_t evt; // Event
prt_dp_cb_struct cb; // Callback
prt_dp_sta_struct sta; // Status
prt_dp_trn_struct trn; // Training
prt_dp_hpd_type hpd; // HPD
prt_dp_lnk_struct lnk; // Link
prt_dp_vid_struct vid; // Video
prt_dp_edid_struct edid; // EDID
#ifdef PRT_SIM
prt_dp_aux_ds_struct aux; // AUX
#endif
} prt_dp_ds_struct;
smbxfdbz 发表于 2024-6-18 17:34
抱着学习的心态,我在看parretto的开源代码,他在PL里只例化了一个riscv cpu呀,没有例化多个cpu
而且我 ...
(引用自42楼)
你编译一遍看看utilization wye11083 发表于 2024-6-18 18:17
你编译一遍看看utilization
(引用自43楼)
也看不出来什么,编译出来的rom.mem,32KB左右
关键我不理解,楼上的那个prt_dp_rom_init 函数是在干什么,从C语言的角度理解,感觉是原地转圈,完全没用一样 没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem Nuker 发表于 2024-6-18 19:47
没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem
(引用自45楼)
28楼有完整代码,能否帮忙看看?
写fifo的话肯定要有地址指针指向某个固定地址呀,但是代码里完全没有这种设定 你就没有注意到写dp->dev->mem循环之前,先写了dp->dev->ctl吗? Nuker 发表于 2024-6-18 19:47
没看代码,盲猜是类似于写fifo的方式按字节写dp->dev->mem
(引用自45楼)
更正,不是字节写,是大小端逆转之后word写 Nuker 发表于 2024-6-18 20:04
你就没有注意到写dp->dev->mem循环之前,先写了dp->dev->ctl吗?
(引用自47楼)
他是写了dp->dev->ctl,但dp->dev->ctl也只是结构体里的一个成员变量,我还是看不出来他是怎么跟硬件rom ram关联在一起的
而且我全局搜索了dp->dev->ctl,只找到这个变量被写,完全没找到在哪里有被引用到
smbxfdbz 发表于 2024-6-18 20:45
他是写了dp->dev->ctl,但dp->dev->ctl也只是结构体里的一个成员变量,我还是看不出来他是怎么跟硬件rom...
(引用自49楼)
prt_dp_app.c的186行:
prt_dp_set_base (&dptx, PRT_DPTX_BASE);
// Set base address
void prt_dp_set_base (prt_dp_ds_struct *dp, uint32_t base)
{
// Base address
dp->dev = (prt_dp_dev_struct *) base;
} thepresent 发表于 2024-6-18 20:51
prt_dp_app.c的186行:
(引用自50楼)
我懂了,谢谢指点
绑定地址后prt_dp_dev_struct中的成员变量就指向了硬件地址,通过操作prt_dp_dev_struct的成员变量就可以操作硬件外设的寄存器了
页:
[1]