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 ____-________