u@home:~$

  • 综合soc2,LC资源不够了,altera的EP4CE6

    前两天把cpu7b加上了vga,准备在FPGA板上跑一下,结果综合的时候说M9K不够了,altera EP4CE6的芯片有30个M9K,soc2里数量超了。 我就先把32KB的RAM改小,最后都改小到2KB了。虽说改小了以后不报M9K不够,改报LC不足了,因为也可以用LC实现memory。 Error (170048): Selected device has 30 RAM location(s) of type M9K. However, the current design needs more than 30 to successfully fit Info (170057): List of RAM cells constrained to M9K locations Info (170000): Node "text80x25:textvga|chrom:rom|altsyncram:altsyncram_component|altsyncram_10b1:auto_generated|ram_block1a1" Info (170000): Node "text80x25:textvga|chrom:rom|altsyncram:altsyncram_component|altsyncram_10b1:auto_generated|ram_block1a0" Info (170000): Node "text80x25:textvga|vgatextram:textram|altsyncram:altsyncram_component|altsyncram_j9u1:auto_generated|q_b[6]" Info (170000): Node...

  • 在sim环境下调个bug

    好久没更新。。。 昨天反馈来一个bug,今天在sim上重现了,定位过程还有点意思,记录下。 Here is this bug. Becasue, previously, there was a heap-related bug in the cmn_init() function. 具体不说了,就是这里的malloc和其它一个模块里自带的malloc重名了,结果编译器用了自带的malloc,而这时自带的malloc还没初始化,导致malloc失败返回NULL。 解决了之前的bug,后面还是在cmn_init()里出了HardFault,所以还是怀疑和heap什么地方有关。 因为没有打开tarmac,所以信息就自己翻。 pc0_iss, ia0_ex1, ia0_ex2, ia0_wr, ia0_ret还有对应的pc1_iss, ia1_ex1, ia1_ex2, ia1_wr, ia1_ret是cortex-m7里双发射的两条流水线里执行阶段的pc值,这里叫ia,instruction address? 因为出错也不知道是在那个pipeline stage,所以还得具体看是啥指令,但能知道个大概范围。 从出错信息能看到有HardFault,是exception 3。 这时候看nvic_int_nxt_isr_i[7:0],这里给出了exception或者interrupt number。可以看到前面的值都是2A和2F,减去16(exception),就是1A和1F,在这实现里是uart0和dmac的外部中断,是正常的。 等到这个值变成3的时候,就是发生HardFault的地方了。 对着代码看,大概觉得是30049A46这的这条指令,是条load指令。 很有可能是load个无效地址导致HardFault,所以接着看r3和r6寄存器这时候都是什么值。 在dpu里找到rf。 r6里是0x161,r3的值是0x3B00003E,很奇怪,这个地址没有sram,所以load这个值导致HardFault没错了。 结合代码,感觉是malloc出来的buff是个靠近0地址的位置,这里是rom,看下内容,都解释通了。 剩下的问题就是heap为啥会这样, heap base在哪。 因为是代码里直接就用的malloc,所以是crt里自带的malloc,好像用的libc是newlib? crt里的malloc没有个heap init这类的函数,是在malloc里调用_sbrk()分出空间来给heap用。 _sbrk的实现貌似很简单,网上找了一段: https://community.silabs.com/s/article/malloc-and-sbrk?language=en_US...

  • Verilog里如果用case但default不是x会什么样