u@home:~$

  • ext_intr sync

    外部中断ext_intr来的时候不确定,可能在一个时钟周期里的任意时刻到,处理的时候也许cycle省的时间不够了,更差的情况是在cycle的末尾,给别的寄存器setup的时间到。所以ext_intr没法直接用,要先同步一下。 同步可以是与clk同步,让ext_intr总是在clk上升沿送进来。 // two-stage synchronizer module sync2r ( input clk, input resetn, input din, output q ); reg d1, d2; always @(posedge clk, or negedge resetn) begin if (resetn) {d2, d1} <= 2'b0; else {d2, d1} <= {d1, din}; end assign q = d2; endmodule 如果要以某一个信号作为起始信号同步,就可以先在sync2r后再与某个信号的上升沿同步。 先做个这个信号上升沿的检测,比如是ifu_exu_valid_rising_e; wire ifu_exu_valid_rising_e; wire...

  • lsu memory interface

    lsu对外数据读写的接口以前是chiplab里的,这样: wire data_req; wire [`GRLEN-1:0] data_pc; wire data_wr; wire [3 :0] data_wstrb; wire [`GRLEN-1:0] data_addr; wire data_cancel_ex2; wire data_cancel; wire [`GRLEN-1:0] data_wdata; wire data_recv; wire data_prefetch; wire data_ll; wire data_sc; wire [`GRLEN-1:0] data_rdata_m; wire data_addr_ok; wire data_data_ok_m; wire [ 5:0] data_exccode; 现在改成这样 wire lsu_biu_rd_req; wire [`GRLEN-1:0] lsu_biu_rd_addr; wire biu_lsu_rd_ack; wire...

  • req和ack

    比如ifu向biu发读内存请求ifu_biu_req,一旦仲裁后得到axi总线,biu发回biu_lsu_ack。 但是ack不能参与到req的逻辑里去,会出现combinational loop,通过dff存一次也不行,loop的warning虽然没有了,但实际在fpga上运行的时候会发现能跑到的频率低很多,比如能跑到75mhz的只能跑50mhz。当时没看综合后工具给出的fmax。 现在c7bbiu实现的方式是biu自己记录当前自己是不是busy,如果busy就不接受新请求,而对req要求不是很严。 比如ifu_biu_req可以是----_,一直给high,直到要求的数据接收到rdata_valid。 这样很不好的一个问题就是,如果数据很久不到,ifu_biu_req就一直是high。现在是lsu的priority更高,如果lsu_biu_req一直是high。现在是单发射,所以问题不明显。 见到的req ack的用法是,requestor自己记录biu是不是busy,比如刚发出了ifu_biu_req,并且通过rd_arbitrator后得到ar channel,发回了biu_ifu_ack。这时ifu自己标记biu_busy。 也就是ifu_biu_req的请求不应该有连续两个high的cycle。 这个还要试试才行。 // instruction fetch in progress wire if_in_prog_in; wire if_in_prog_q; wire biu_busy; assign biu_busy = if_in_prog_q; // | others // if inst_cancel, inst_valid_f will not coming, so let if_in_prog_in finish wire if_fin; assign if_fin = inst_valid_f | inst_cancel; assign if_in_prog_in...