u@home:~$

  • 香山里的page table walker

    ptw里的l1,l2,l3 PTW module里的参数,page cache发给ptw的请求。 output io_req_ready, input io_req_valid, input [37:0] io_req_bits_req_info_vpn, input [1:0] io_req_bits_req_info_s2xlate, input [1:0] io_req_bits_req_info_source, input io_req_bits_l3Hit, input io_req_bits_l2Hit, input [43:0] io_req_bits_ppn, input io_req_bits_stage1Hit, 其中有l3Hit和l2Hit。 从代码里看,l3Hit是支持Sv48时,根页表(level 3)tlb hit。(这个不好说是不是叫level3页表,香山文档里的叫法和代码里好像不一致) l3Hit在Sv39时不用。l2Hit在Sv39里是根页表(level 2)tlb hit。 以Sv39为例,l2,l1,l0三级分页,l0是leaf pte。 对于ptw来说,只处理l2,l1的page walk,l0 leaf pte是由llptw(Last Level Page Table Walker)处理。 所以只可能有l2Hit,不可能同时l2Hit,l1Hit,因为这样的情况就发给llptw了。 对于Sv48来说,最多可能有同时l3Hit,l2Hit。 这也是为什么ptw的参数里面没有l1Hit。 ptw里有内部信号level,af_level(access fault level)表示当前要处理的page table是几级的。这里还没仔细看,大概是这个意思。...

  • 看到个接口上保存信号的

    接口给过来的信号xxx只持续一个cycle,这样的信号可能要接收端保存下。存到dff后,保存的xxx_q要到下一个cycle才行,但这个信号也许当前这个cycle就要用,那就把xxx和xxx_q或起来 xxx | xxx_q 这样的代码写不少了,这回是看到别人代码里也这样用,说明大家都遇到过相似的情况。不过这里用的不是或, 而是有一个信号表示是不是第一个cycle。 这个是always的代码风格。 reg [2:0] attrs_reg; always @(posedge clk or negedge reset_n) if (~reset_n) attrs_reg <= {3{1'b0}}; else if (fist_cycle) attrs_reg <= attrs_i; wire [2:0] attrs = first_cycle ? attrs_i : attrs_reg;

  • 记点和icache相关的

    Line Fill Buffer(LFB) 256-bit 4 64-bit input pfu_icu_req_i, input [31:3] pfu_icu_addr_i, input pfu_icu_first_i, input pfu_icu_priv_i, input pfu_icu_vf_i, output icu_pfu_ack_o, LFB 填充进一个cache line的时候,按总线宽度,可以是4次64-bit。 对外接口的话,icache控制模块icu不需要考虑比如是否是axi burst。 output icu_biu_req, input biu_icu_ack, input [63:0] biu_icu_data, input biu_icu_data_valid, reg [31:3] lfb_addr; reg [255:0] lfb_data; always @(posedge clk or negedge resetn) if (~resetn) begin lfb_addr <=...