u@home:~$

gs132 ifcbus

这两天看gs132的代码,看到CPU_gs132/ls132r_interface.v

里面的ifc还没搞明白是什么,应该不是instruction fetch control。

因为从代码里可以看出来,有inst到ifc,也有data到ifc。

output          idle_in_ifc_o;

input  [`Ltoifcbus-1:0]     inst_ifc_i;
output [`Lfromifcbus-1:0]   ifc_inst_o;

input  [`Ltoifcbus-1:0]     data_ifc_i;
output [`Lfromifcbus-1:0]   ifc_data_o;

wire        inst_ifc_valid = inst_ifc_i[ 0: 0];
wire [ 3:0] inst_ifc_width = inst_ifc_i[ 4: 1];
wire [ 3:0] inst_ifc_ben   = inst_ifc_i[ 8: 5];
wire        inst_ifc_wr    = inst_ifc_i[ 9: 9];
wire [31:0] inst_ifc_addr  = inst_ifc_i[41:10];
wire [31:0] inst_ifc_wdata = inst_ifc_i[73:42];

wire        inst_ifc_ack  ;
wire        inst_ifc_rrdy ;
wire [31:0] inst_ifc_rdata;

assign ifc_inst_o[ 0: 0] = inst_ifc_ack  ;
assign ifc_inst_o[ 1: 1] = inst_ifc_rrdy ;
assign ifc_inst_o[33: 2] = inst_ifc_rdata;

wire        data_ifc_valid = data_ifc_i[ 0: 0];
wire [ 3:0] data_ifc_width = data_ifc_i[ 4: 1];
wire [ 3:0] data_ifc_ben   = data_ifc_i[ 8: 5];
wire        data_ifc_wr    = data_ifc_i[ 9: 9];
wire [31:0] data_ifc_addr  = data_ifc_i[41:10];
wire [31:0] data_ifc_wdata = data_ifc_i[73:42];

wire        data_ifc_rack ;
wire        data_ifc_rrdy ;
wire [31:0] data_ifc_rdata;
wire        data_ifc_wack ;

assign ifc_data_o[ 0: 0] = data_ifc_rack ;
assign ifc_data_o[ 1: 1] = data_ifc_rrdy ;
assign ifc_data_o[33: 2] = data_ifc_rdata;
assign ifc_data_o[34:34] = data_ifc_wack ;

晕 找了半天,gs132里并没有axi_sram_bridge这样的ip。

要不就是直接用sram,要不就是用的xilinx的axi_sram。

从gs132的目录结构看。

.
└── CPU_CDE_AXI
    ├── cpu132_gettrace
    │   ├── golden_trace.txt
    │   ├── rtl
    │   │   ├── BRIDGE
    │   │   ├── CONFREG
    │   │   ├── CPU_gs132
    │   │   ├── soc_lite_top.v
    │   │   ├── tags
    │   │   └── xilinx_ip
    │   ├── run_vivado
    │   │   ├── cpu132_gettrace
    │   │   └── soc_lite.xdc
    │   └── testbench
    │       └── tb_top.v
    ├── mycpu_axi_verify
    │   ├── rtl
    │   │   ├── axi_wrap
    │   │   ├── CONFREG
    │   │   ├── myCPU
    │   │   ├── ram_wrap
    │   │   ├── soc_axi_lite_top.v
    │   │   ├── tags
    │   │   └── xilinx_ip
    │   ├── run_vivado
    │   │   ├── mycpu_prj1
    │   │   └── soc_lite.xdc
    │   └── testbench
    │       └── mycpu_tb.v
    ├── Readme_First.txt
    └── soft

一个是cpu132_gettrace,core的实现在这个目录下的myCPU里。

但是ls132r_top里的ls132r_interface看似是用了axi的接口,实际上axi的信号都没用上,最终还是sram的信号出去了。

而mycpu_axi_verify下的myCPU目录是空的。soc_axi_lite_top.v里也用的是mycpu_top,而不是上面说的ls132r_top。

这个mycpu_top到是和chiplab里的那个差不多。

soc_axi_lite_top.v里还用了个axi_crossbar_1x2,是xilinx的ip。这个crossbar我也是没看明白。

axi_crossbar_1x2 u_axi_crossbar_1x2(
    .aclk             ( cpu_wrap_aclk        ), // i, 1                 
    .aresetn          ( cpu_wrap_aresetn     ), // i, 1                 

    .s_axi_arid       ( cpu_wrap_arid        ),
    .s_axi_araddr     ( cpu_wrap_araddr      ),
    .s_axi_arlen      ( cpu_wrap_arlen[3:0]  ),
    .s_axi_arsize     ( cpu_wrap_arsize      ),
    .s_axi_arburst    ( cpu_wrap_arburst     ),
    .s_axi_arlock     ( cpu_wrap_arlock      ),
    .s_axi_arcache    ( cpu_wrap_arcache     ),
    .s_axi_arprot     ( cpu_wrap_arprot      ),
    .s_axi_arqos      ( 4'd0                 ),
    .s_axi_arvalid    ( cpu_wrap_arvalid     ),
    .s_axi_arready    ( cpu_wrap_arready     ),
    .s_axi_rid        ( cpu_wrap_rid         ),
    .s_axi_rdata      ( cpu_wrap_rdata       ),
    .s_axi_rresp      ( cpu_wrap_rresp       ),
    .s_axi_rlast      ( cpu_wrap_rlast       ),
    .s_axi_rvalid     ( cpu_wrap_rvalid      ),
    .s_axi_rready     ( cpu_wrap_rready      ),
    .s_axi_awid       ( cpu_wrap_awid        ),
    .s_axi_awaddr     ( cpu_wrap_awaddr      ),
    .s_axi_awlen      ( cpu_wrap_awlen[3:0]  ),
    .s_axi_awsize     ( cpu_wrap_awsize      ),
    .s_axi_awburst    ( cpu_wrap_awburst     ),
    .s_axi_awlock     ( cpu_wrap_awlock      ),
    .s_axi_awcache    ( cpu_wrap_awcache     ),
    .s_axi_awprot     ( cpu_wrap_awprot      ),
    .s_axi_awqos      ( 4'd0                 ),
    .s_axi_awvalid    ( cpu_wrap_awvalid     ),
    .s_axi_awready    ( cpu_wrap_awready     ),
    .s_axi_wid        ( cpu_wrap_wid         ),
    .s_axi_wdata      ( cpu_wrap_wdata       ),
    .s_axi_wstrb      ( cpu_wrap_wstrb       ),
    .s_axi_wlast      ( cpu_wrap_wlast       ),
    .s_axi_wvalid     ( cpu_wrap_wvalid      ),
    .s_axi_wready     ( cpu_wrap_wready      ),
    .s_axi_bid        ( cpu_wrap_bid         ),
    .s_axi_bresp      ( cpu_wrap_bresp       ),
    .s_axi_bvalid     ( cpu_wrap_bvalid      ),
    .s_axi_bready     ( cpu_wrap_bready      ),

    .m_axi_arid       ( {ram_arid   ,conf_arid   } ),
    .m_axi_araddr     ( {ram_araddr ,conf_araddr } ),
    .m_axi_arlen      ( {ram_arlen  ,conf_arlen  } ),
    .m_axi_arsize     ( {ram_arsize ,conf_arsize } ),
    .m_axi_arburst    ( {ram_arburst,conf_arburst} ),
    .m_axi_arlock     ( {ram_arlock ,conf_arlock } ),
    .m_axi_arcache    ( {ram_arcache,conf_arcache} ),
    .m_axi_arprot     ( {ram_arprot ,conf_arprot } ),
    .m_axi_arqos      (                            ),
    .m_axi_arvalid    ( {ram_arvalid,conf_arvalid} ),
    .m_axi_arready    ( {ram_arready,conf_arready} ),
    .m_axi_rid        ( {ram_rid    ,conf_rid    } ),
    .m_axi_rdata      ( {ram_rdata  ,conf_rdata  } ),
    .m_axi_rresp      ( {ram_rresp  ,conf_rresp  } ),
    .m_axi_rlast      ( {ram_rlast  ,conf_rlast  } ),
    .m_axi_rvalid     ( {ram_rvalid ,conf_rvalid } ),
    .m_axi_rready     ( {ram_rready ,conf_rready } ),
    .m_axi_awid       ( {ram_awid   ,conf_awid   } ),
    .m_axi_awaddr     ( {ram_awaddr ,conf_awaddr } ),
    .m_axi_awlen      ( {ram_awlen  ,conf_awlen  } ),
    .m_axi_awsize     ( {ram_awsize ,conf_awsize } ),
    .m_axi_awburst    ( {ram_awburst,conf_awburst} ),
    .m_axi_awlock     ( {ram_awlock ,conf_awlock } ),
    .m_axi_awcache    ( {ram_awcache,conf_awcache} ),
    .m_axi_awprot     ( {ram_awprot ,conf_awprot } ),
    .m_axi_awqos      (                            ),
    .m_axi_awvalid    ( {ram_awvalid,conf_awvalid} ),
    .m_axi_awready    ( {ram_awready,conf_awready} ),
    .m_axi_wid        ( {ram_wid    ,conf_wid    } ),
    .m_axi_wdata      ( {ram_wdata  ,conf_wdata  } ),
    .m_axi_wstrb      ( {ram_wstrb  ,conf_wstrb  } ),
    .m_axi_wlast      ( {ram_wlast  ,conf_wlast  } ),
    .m_axi_wvalid     ( {ram_wvalid ,conf_wvalid } ),
    .m_axi_wready     ( {ram_wready ,conf_wready } ),
    .m_axi_bid        ( {ram_bid    ,conf_bid    } ),
    .m_axi_bresp      ( {ram_bresp  ,conf_bresp  } ),
    .m_axi_bvalid     ( {ram_bvalid ,conf_bvalid } ),
    .m_axi_bready     ( {ram_bready ,conf_bready } )
    .m_axi_bvalid     ( {ram_bvalid ,conf_bvalid } ),
    .m_axi_bready     ( {ram_bready ,conf_bready } )

 );

把cpu变slave,然后sram核confreg是master?

//axi ram
axi_wrap_ram u_axi_ram
(
    .aclk          ( cpu_clk          ),
    .aresetn       ( cpu_resetn       ),
    //ar
    .axi_arid      ( ram_arid         ),
    .axi_araddr    ( ram_araddr       ),
    .axi_arlen     ( {4'd0,ram_arlen} ),
    .axi_arsize    ( ram_arsize       ),
    .axi_arburst   ( ram_arburst      ),
    .axi_arlock    ( ram_arlock       ),
    .axi_arcache   ( ram_arcache      ),
    .axi_arprot    ( ram_arprot       ),
    .axi_arvalid   ( ram_arvalid      ),
    .axi_arready   ( ram_arready      ),
    //r             
    .axi_rid       ( ram_rid          ),
    .axi_rdata     ( ram_rdata        ),
    .axi_rresp     ( ram_rresp        ),
    .axi_rlast     ( ram_rlast        ),
    .axi_rvalid    ( ram_rvalid       ),
    .axi_rready    ( ram_rready       ),
    //aw           
    .axi_awid      ( ram_awid         ),
    .axi_awaddr    ( ram_awaddr       ),
    .axi_awlen     ( {4'd0,ram_awlen[3:0]}        ),
    .axi_awsize    ( ram_awsize       ),
    .axi_awburst   ( ram_awburst      ),
    .axi_awlock    ( ram_awlock       ),
    .axi_awcache   ( ram_awcache      ),
    .axi_awprot    ( ram_awprot       ),
    .axi_awvalid   ( ram_awvalid      ),
    .axi_awready   ( ram_awready      ),
    //w          
    .axi_wid       ( ram_wid          ),
    .axi_wdata     ( ram_wdata        ),
    .axi_wstrb     ( ram_wstrb        ),
    .axi_wlast     ( ram_wlast        ),
    .axi_wvalid    ( ram_wvalid       ),
    .axi_wready    ( ram_wready       ),
    //b              ram
    .axi_bid       ( ram_bid          ),
    .axi_bresp     ( ram_bresp        ),
    .axi_bvalid    ( ram_bvalid       ),
    .axi_bready    ( ram_bready       ),

    //random mask
    .ram_random_mask ( ram_random_mask )
);

//confreg
confreg #(.SIMULATION(SIMULATION)) u_confreg
(
    .timer_clk   ( timer_clk  ),  // i, 1   
    .aclk        ( cpu_clk    ),  // i, 1   
    .aresetn     ( cpu_resetn ),  // i, 1    

    .arid        (conf_arid    ),
    .araddr      (conf_araddr  ),
    .arlen       (conf_arlen   ),
    .arsize      (conf_arsize  ),
    .arburst     (conf_arburst ),
    .arlock      (conf_arlock  ),
    .arcache     (conf_arcache ),
    .arprot      (conf_arprot  ),
    .arvalid     (conf_arvalid ),
    .arready     (conf_arready ),
    .rid         (conf_rid     ),
    .rdata       (conf_rdata   ),
    .rresp       (conf_rresp   ),
    .rlast       (conf_rlast   ),
    .rvalid      (conf_rvalid  ),
    .rready      (conf_rready  ),
    .awid        (conf_awid    ),
    .awaddr      (conf_awaddr  ),
    .awlen       (conf_awlen   ),
    .awsize      (conf_awsize  ),
    .awburst     (conf_awburst ),
    .awlock      (conf_awlock  ),
    .awcache     (conf_awcache ),
    .awprot      (conf_awprot  ),
    .awvalid     (conf_awvalid ),
    .awready     (conf_awready ),
    .wid         (conf_wid     ),
    .wdata       (conf_wdata   ),
    .wstrb       (conf_wstrb   ),
    .wlast       (conf_wlast   ),
    .wvalid      (conf_wvalid  ),
    .wready      (conf_wready  ),
    .bid         (conf_bid     ),
    .bresp       (conf_bresp   ),
    .bvalid      (conf_bvalid  ),
    .bready      (conf_bready  ),

    .ram_random_mask ( ram_random_mask ),
    .led         ( led        ),  // o, 16   
    .led_rg0     ( led_rg0    ),  // o, 2      
    .led_rg1     ( led_rg1    ),  // o, 2      
    .num_csn     ( num_csn    ),  // o, 8      
    .num_a_g     ( num_a_g    ),  // o, 7      
    .switch      ( switch     ),  // i, 8     
    .btn_key_col ( btn_key_col),  // o, 4          
    .btn_key_row ( btn_key_row),  // i, 4           
    .btn_step    ( btn_step   )   // i, 2   
);

axi_wrap_ram和confreg都是axi的接口。

axi_wrap_ram是个xilinx的ip。

confreg是有实现的,虽然不是想找的axi_sram_bridge,但这个里面应该可以学到东西。

还要是CPU_CDE_AXI/mycpu_axi_verify/rtl/CONFREG/confreg.v,这个里面的confreg才是axi接口的。