电子说
最近看不少群里聊怎么实现,也有一些具体实现,我们就不聊这些了,今天聊一下为什么要这么做,有哪些注意事项,以及怎么做(理论层面不牵扯代码),手机打字有错误请见谅
为什么要做?
在使用arm riscv和x86系统时,没有c与其它语言交互的途径和方法,更不要说格式化打印,这就导致我们对于c的debug会相对困难。毕竟通过pc查找反汇编方法debug不太直观,很多时候我们知道他不会挂,只想单纯知道它运行到哪里了,以方便做进一步操作。
另一方面使用c调用其它语言比如sv的task并执行也是我们所需要的。假设一个场景通过c调用一个sv i2c task执行进行数据发送,并在c端不断检测i2c task是否执行完毕(这期间可以先做别的,做完了再回来看看)。
当然还有更复杂的操作,这就让我们的c写法灵活性更大,可复用性更强,这是系统方案的一部分,不能孤立的看。
需要注意什么?
执行效率 支持多种不同的硬件接口 cache 多核并行等
执行效率,就是我们在调用该方法的执行速度,比如不少人通过uart实现,先不说uart的频率很难上去,就它的串行执行,如果数据多一点,我们的case执行被打印占据大量时间肯定不是想要的。当然可以减少打印,太少了就有点坑了。
支持不同的硬件接口,一般来说axi的速度快很多,也可以并行执行,是一个理想的总线,但因为一些限制(后仿),线并不总能被找到,i2c uart都需要可以被支持,且可以灵活切换。
cache,这里说cache原因,当我们使用axi时,cpu发出的指令都是以一个cacheline为单位的,这就让我们原先的一些交互策略失效,需要提前考虑。
多核并行,需要我们对不同cpu发出的命令区分开,以防命令串扰,使得打印出乱七八糟的东西出来。
怎么做?
有不少人写,这里不多说,补充一点个人的理解。
我们需要做出一种有针对性的交互协议,用于对上述为什么以及注意事项的支持,也要尽量减少对地址的占用,毕竟有的项目地址还是挺紧张的,我们大致可以实现使用64byte对应的地址的占用,很多时候使用1个dw就好了。
如果有对sv task调用(其它语言类似),就需要支持更多,比如多核对同一task并行调用,对task实施kill操作,获取返回值,查看task执行状态等操作。
更进一步我们还可以通过virtualcpu等方案让该c在ip阶段就完成测试,soc阶段只是进一步测试,而不需要重新编写,让soc case尽量提前,实现多维度并行。
全部0条评论
快来发表一下你的评论吧 !