diff options
| author | Matt Ettus <matt@ettus.com> | 2010-05-20 13:43:13 -0700 | 
|---|---|---|
| committer | Matt Ettus <matt@ettus.com> | 2010-05-20 13:43:13 -0700 | 
| commit | c6e8d0658dc66e9a24a87d4574c649b77ec4075d (patch) | |
| tree | 2c212b640c1f8f5d81447c3360ffaed401f4c53a | |
| parent | 621ad7cc9e68b4e304b616d8f840d3a03a047c8b (diff) | |
| download | uhd-c6e8d0658dc66e9a24a87d4574c649b77ec4075d.tar.gz uhd-c6e8d0658dc66e9a24a87d4574c649b77ec4075d.tar.bz2 uhd-c6e8d0658dc66e9a24a87d4574c649b77ec4075d.zip | |
removes the icache and pipelines the reads
| -rw-r--r-- | usrp2/control_lib/ram_harvard.v | 71 | ||||
| -rw-r--r-- | usrp2/opencores/aemb/rtl/verilog/aeMB_bpcu.v | 5 | ||||
| -rw-r--r-- | usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v | 27 | ||||
| -rwxr-xr-x | usrp2/top/u2_core/u2_core.v | 10 | ||||
| -rw-r--r-- | usrp2/top/u2_rev3/Makefile | 1 | 
5 files changed, 98 insertions, 16 deletions
| diff --git a/usrp2/control_lib/ram_harvard.v b/usrp2/control_lib/ram_harvard.v new file mode 100644 index 000000000..6711da366 --- /dev/null +++ b/usrp2/control_lib/ram_harvard.v @@ -0,0 +1,71 @@ + + +// Dual ported, Harvard architecture, cached ram + +module ram_harvard +  #(parameter AWIDTH=15, +    parameter RAM_SIZE=16384, +    parameter ICWIDTH=6, +    parameter DCWIDTH=6) +    +    (input wb_clk_i,  +     input wb_rst_i, +     // Firmware download port. +     input [AWIDTH-1:0] ram_loader_adr_i, +     input [31:0] ram_loader_dat_i, +     input ram_loader_stb_i, +     input [3:0] ram_loader_sel_i, +     input ram_loader_we_i, +     output ram_loader_ack_o, +     input ram_loader_done_i,     +     // Instruction fetch port. +     input [AWIDTH-1:0] if_adr, +     output [31:0] if_data, +     // Data access port. +     input [AWIDTH-1:0] dwb_adr_i, +     input [31:0] dwb_dat_i,  +     output [31:0] dwb_dat_o, +     input dwb_we_i, +     output dwb_ack_o, +     input dwb_stb_i, +     input [3:0] dwb_sel_i, + +     input flush_icache ); + +   reg 	   ack_d1; +   reg 	   stb_d1; +    +    +   dpram32 #(.AWIDTH(AWIDTH),.RAM_SIZE(RAM_SIZE))  +   sys_ram +     (.clk(wb_clk_i), +      .adr1_i(ram_loader_done_i ? if_adr : ram_loader_adr_i), +      .dat1_i(ram_loader_dat_i), +      .dat1_o(if_data), +      .we1_i(ram_loader_done_i ? 1'b0 : ram_loader_we_i), +      .en1_i(ram_loader_done_i ? 1'b1 : ram_loader_stb_i), +      .sel1_i(ram_loader_done_i ? 4'hF : ram_loader_sel_i), +      .adr2_i(dwb_adr_i), +      .dat2_i(dwb_dat_i), +      .dat2_o(dwb_dat_o), +      .we2_i(dwb_we_i), +      .en2_i(dwb_stb_i), +      .sel2_i(dwb_sel_i)  +      ); + +   assign dwb_ack_o = dwb_stb_i & (dwb_we_i | (stb_d1 & ~ack_d1)); + +   always @(posedge wb_clk_i)  +     if(wb_rst_i) +       ack_d1 <= 1'b0; +     else  +       ack_d1 <= dwb_ack_o; + +   always @(posedge wb_clk_i) +     if(wb_rst_i) +       stb_d1 <= 0; +     else +       stb_d1 <= dwb_stb_i; +    + +endmodule // ram_harv_cache diff --git a/usrp2/opencores/aemb/rtl/verilog/aeMB_bpcu.v b/usrp2/opencores/aemb/rtl/verilog/aeMB_bpcu.v index a7c686e7e..81587e25c 100644 --- a/usrp2/opencores/aemb/rtl/verilog/aeMB_bpcu.v +++ b/usrp2/opencores/aemb/rtl/verilog/aeMB_bpcu.v @@ -125,7 +125,7 @@ module aeMB_bpcu (/*AUTOARG*/     reg [31:2] 	   rPC, xPC;     reg [31:2] 	   rPCLNK, xPCLNK; -   assign 	   iwb_adr_o = rIPC[IW-1:2]; +   assign 	   iwb_adr_o = gena ? xIPC[IW-1:2] :  rIPC[IW-1:2]; //IJB     always @(/*AUTOSENSE*/rBRA or rIPC or rPC or rRESULT) begin        //xPCLNK <= (^rATOM) ? rPC : rPC; @@ -168,7 +168,8 @@ module aeMB_bpcu (/*AUTOARG*/  	rATOM <= 2'h0;  	rBRA <= 1'h0;  	rDLY <= 1'h0; -	rIPC <= 30'h0; +//	rIPC <= 30'h0; +	rIPC <= 30'h3fffffff; // DWORD aligned address   	rPC <= 30'h0;  	rPCLNK <= 30'h0;  	// End of automatics diff --git a/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v b/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v index 9ffa20ff2..38ca3a023 100644 --- a/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v +++ b/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v @@ -10,12 +10,10 @@ module aeMB_core_BE      parameter MUL=0, parameter BSF=0)      (input sys_clk_i,       input sys_rst_i, - -     output iwb_stb_o, -     output [ISIZ-1:0] iwb_adr_o, -     input [31:0] iwb_dat_i, -     input iwb_ack_i, - +     // Instruction port +     output [14:0] if_adr, +     input [31:0] if_dat, +     // Data port       output dwb_we_o,       output dwb_stb_o,       output [DSIZ-1:0] dwb_adr_o, @@ -28,17 +26,28 @@ module aeMB_core_BE       input sys_int_i,        input sys_exc_i); -   assign  dwb_cyc_o = dwb_stb_o; +   wire [ISIZ-1:0] iwb_adr_o; +   wire [31:0] 	   iwb_dat_i; +   wire 	   iwb_ack_i; +   wire 	   iwb_stb_o; +    +   assign dwb_cyc_o = dwb_stb_o; +   assign iwb_ack_i = 1'b1; +   assign if_adr = iwb_adr_o[14:0]; +   assign iwb_dat_i = if_dat; + +   // Note some "wishbone" instruction fetch signals pruned on external interface +   // but not propogated change deep into aeMB.     aeMB_edk32 #(.IW(ISIZ),.DW(DSIZ),.MUL(MUL),.BSF(BSF))       aeMB_edk32 (.sys_clk_i(sys_clk_i),   		 .sys_rst_i(sys_rst_i), -		  +		 // Instruction Port  		 .iwb_stb_o(iwb_stb_o),  		 .iwb_adr_o(iwb_adr_o[ISIZ-1:2]),  		 .iwb_ack_i(iwb_ack_i),  		 .iwb_dat_i(iwb_dat_i), -		  +		 // Data port  		 .dwb_wre_o(dwb_we_o),  		 .dwb_stb_o(dwb_stb_o),  		 .dwb_adr_o(dwb_adr_o[DSIZ-1:2]), diff --git a/usrp2/top/u2_core/u2_core.v b/usrp2/top/u2_core/u2_core.v index df74c7dba..5e0b569cc 100755 --- a/usrp2/top/u2_core/u2_core.v +++ b/usrp2/top/u2_core/u2_core.v @@ -284,8 +284,8 @@ module u2_core     aeMB_core_BE #(.ISIZ(16),.DSIZ(16),.MUL(0),.BSF(1))       aeMB (.sys_clk_i(wb_clk), .sys_rst_i(wb_rst),  	   // Instruction Wishbone bus to I-RAM -	   .iwb_stb_o(iwb_stb),.iwb_adr_o(iwb_adr), -	   .iwb_dat_i(iwb_dat),.iwb_ack_i(iwb_ack), +	   .if_adr(if_adr), +	   .if_dat(if_dat),  	   // Data Wishbone bus to system bus fabric  	   .dwb_we_o(m0_we),.dwb_stb_o(m0_stb),.dwb_dat_o(m0_dat_i),.dwb_adr_o(m0_adr),  	   .dwb_dat_i(m0_dat_o),.dwb_ack_i(m0_ack),.dwb_sel_o(m0_sel),.dwb_cyc_o(m0_cyc), @@ -299,7 +299,7 @@ module u2_core     // I-port connects directly to processor and ram loader     wire 	 flush_icache; -   ram_harv_cache #(.AWIDTH(15),.RAM_SIZE(RAM_SIZE),.ICWIDTH(7),.DCWIDTH(6)) +   ram_harvard #(.AWIDTH(15),.RAM_SIZE(RAM_SIZE),.ICWIDTH(7),.DCWIDTH(6))       sys_ram(.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),  	     .ram_loader_adr_i(ram_loader_adr[14:0]), .ram_loader_dat_i(ram_loader_dat), @@ -307,8 +307,8 @@ module u2_core  	     .ram_loader_we_i(ram_loader_we), .ram_loader_ack_o(ram_loader_ack),  	     .ram_loader_done_i(ram_loader_done), -	     .iwb_adr_i(iwb_adr[14:0]), .iwb_stb_i(iwb_stb), -	     .iwb_dat_o(iwb_dat), .iwb_ack_o(iwb_ack), +	     .if_adr(if_adr),  +	     .if_data(if_dat),   	     .dwb_adr_i(s0_adr[14:0]), .dwb_dat_i(s0_dat_o), .dwb_dat_o(s0_dat_i),  	     .dwb_we_i(s0_we), .dwb_ack_o(s0_ack), .dwb_stb_i(s0_stb), .dwb_sel_i(s0_sel), diff --git a/usrp2/top/u2_rev3/Makefile b/usrp2/top/u2_rev3/Makefile index 80d09acb7..bfebcac8b 100644 --- a/usrp2/top/u2_rev3/Makefile +++ b/usrp2/top/u2_rev3/Makefile @@ -66,6 +66,7 @@ control_lib/mux4.v \  control_lib/mux8.v \  control_lib/nsgpio.v \  control_lib/ram_2port.v \ +control_lib/ram_harvard.v \  control_lib/ram_harv_cache.v \  control_lib/ram_loader.v \  control_lib/setting_reg.v \ | 
