fshc之请求仲裁机制的代码分析
1 always@(posedge spi_clk or negedge spiclk_rst_n) 2 begin 3 if(~spiclk_rst_n) 4 arbiter2cache_ack_r <=1'b0; 5 else if(cache_req_sclk && flash_idle && ~atom_op_en_sync2 && ~arbiter2mcu_ack_r) 6 arbiter2cache_ack_r <=1'b1; 7 else if(mcu_req_arb && flash_idle && ~arbiter2cache_ack_r) 8 arbiter2cache_ack_r <=arbiter2cache_ack_r; 9 else 10 arbiter2cache_ack_r <=1'b0; 11 end 12 13 always@(posedge spi_clk or negedge spiclk_rst_n) 14 begin 15 if(~spiclk_rst_n) 16 arbiter2mcu_ack_r <=1'b0; 17 else if(cache_req_sclk && flash_idle && ~atom_op_en_sync2 && ~arbiter2mcu_ack_r) 18 arbiter2mcu_ack_r <=arbiter2mcu_ack_r; 19 else if(mcu_req_arb && flash_idle && ~arbiter2cache_ack_r) 20 arbiter2mcu_ack_r <=1'b1; 21 else 22 arbiter2mcu_ack_r <=1'b0; 23 end
两个always语句块实现了三条功能:
1.cache/mcu请求如果,mcu请求已经访问flash,则cache请求不能break该访问,只能等待此次访问结束才会响应cache的访问。cache先请求也同理。两个always语句参考对比看,不要只看一个。
2.cache/mcu请求若同时有效,则cache请求的优先级高于MCU的请求。主要利用ifelse语句的优先级实现的。第6行代码优先级高于第20行代码。
3.如果atom_op_en_sysn2有效,只响应MCU的请求。
4.注意本模块处于sclk时钟域。但输入处于hclk时钟域。通过这两个always看不出来,呵呵。
狠芯低成本,专芯低功耗,计划高性能。