-
microcode something
Trying to learn the microcode syntax. Put some data here. u@uu:~/prjs/lib-micro/build$ ./ms_match_n_patch_read idx p src dst 00: 0 0x0000 0x0000 01: 1 0x1434 0x06c6 02: 1 0x4c04 0x7c0a 03: 1 0x61e6 0x7cae 04: 1 0x757a 0x7cb0 05: 1 0x244a 0x7cdc 06: 1 0x065c 0x7c5c 07: 1 0x29ca 0x7c2e 08: 1...
-
香山里的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;