u@home:~$

  • timer中断发生在branch指令后的下一条指令

    例子就是下面这样,设置好timer,正好在1c000044的时候触发,在beq指令的下一句。 这么测的原因是interrupt和branch都会改pc_bf,看看这俩会不会冲突。 Disassembly of section .text: 1c000000 <_start>: kernel_entry(): 1c000000: 14380006 lu12i.w $r6,114688(0x1c000) 1c000004: 028230c6 addi.w $r6,$r6,140(0x8c) 1c000008: 04003026 csrwr $r6,0xc 1c00000c: 02802805 addi.w $r5,$r0,10(0xa) 1c000010: 02801006 addi.w $r6,$r0,4(0x4) 1c000014: 04000026 csrwr $r6,0x0 1c000018: 02804406 addi.w $r6,$r0,17(0x11) 1c00001c: 04010426 csrwr $r6,0x41 1c000020: 02800005 addi.w $r5,$r0,0 1c000024: 02800000 addi.w $r0,$r0,0 1c000028:...

  • cpu7b csr timer

    这次实现csr里的timer,遇到的问题估计以前遇到过,但忘了怎么处理了。 问题是:timer倒数到0后,产生timer_intr,这个信号是存在一个cycle的。 但timer要做成level中断,也就是在不清理中断源之前,timer中断的信号一直都是高的。只有一个cycle,就是edge中断了。 exu_ifu_except通知ifu,这个信号只能是一个cycle,否则会stall住ifu。 应该给自己规定下,模块之间传递的信号,都是1 cycle。如果需要一直拉高的信号,由接收的模块自己提供寄存器解决。 比如这个timer的level interrupt,在csr模块里确实是有一个1bit寄存器一直给出1,作为中断源,直到写ticlr寄存器关掉这个中断源。 但csr给ecl的csr_ecl_timer_intr,是只有一个cycle。这个是通过crmd.ie位的参与实现的,因为进了中断处理函数,crmd.ie存入prmd.pie,当前crmd.ie置0,关中断。表示当前中断处理函数不会被打断,但中断处理函数返回后中断又可以了。 ticlr_clr ____--------- crmd_ie -----________ csr_ecl_timer_intr ____-________

  • 综合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...