readout_rm/spi_rw.sv

143 lines
5.8 KiB
Systemverilog
Raw Permalink Normal View History

//given a spi_item, and read or write reg_mems.
class spi_rw;
function rw(ref spi_item spi_pkg);
int len = spi_pkg.data.size();
int max_len = 0;
bit [24:0] start;
bit [19:0] addr ;
int i = 0;
start = spi_pkg.addr;
case(start[24:20])
5'h00 : max_len = 32;
5'h01 : max_len = (start[9:8]==2'b01) ? 52 :
(start[9:8]==2'b10) ? 16 :
(start[9:8]==2'b11) ? 44 :
0;
5'h02 : max_len = 32768;
5'h03 : max_len = 32768;
5'h04 : max_len = 1024;
5'h05 : max_len = 524288;
5'h06 : max_len = 524288;
5'h07 : max_len = 32768;
5'h08 : max_len = 32768;
5'h09 : max_len = 80;
5'h0A : max_len = 1024;
5'h0B : max_len = 262144;
5'h1F : max_len = 16;
endcase
for(i=0;i<len;i++) begin
if(start[24:20] == 5'b01) begin
addr = (start[7 :0] + (i[7 :0]<<2)) % (max_len) + {{start[19: 8]}, 8'b0};
end
else begin
addr = (start[19:0] + (i[19:0]<<2)) % (max_len) ;
end
$display("start:%h\taddr:%h",start,addr);
if(spi_pkg.cmd) begin
//$display("rd_data:%h",single_read(spi_pkg.addr + 4*i));
spi_pkg.data[i] = single_read(start, addr);
end
else begin
single_write(start, addr, spi_pkg.data[i]);
end
end
endfunction
function bit[31:0] single_read(bit[24: 0] start, bit[19: 0] addr);
bit[31:0] s_data;//,temp;
//$display("spi read the addr:%h",addr);
//$display(reg_mems::match_filter.data[int'(addr[19: 0]) +: 4]);
//temp={<<byte {reg_mems::match_filter.data[int'(addr[19: 0]) +: 4]}};
//$display("temp=%h",temp);
case(start[24:20])
5'h00 : s_data = reg_mems::sys_regfile.data[int'(addr[19: 2])];
5'h01 : s_data = (start[9:8]==2'b01) ? reg_mems::dac_regfile.data[int'(addr[7:2])] :
(start[9:8]==2'b10) ? reg_mems::adc_regfile.data[int'(addr[7:2])] :
(start[9:8]==2'b11) ? reg_mems::pll_regfile.data[int'(addr[7:2])] :
32'b0;
5'h02 : s_data = {<<byte {reg_mems::daq_inst_ram.data[int'(addr[19: 0]) +: 4]}};
5'h03 : s_data = {<<byte {reg_mems::daq_data_ram.data[int'(addr[19: 0]) +: 4]}};
5'h04 : s_data = reg_mems::daq_regfile.data[int'(addr[19: 2])];
5'h05 : s_data = {<<byte {reg_mems::match_filter.data[int'(addr[19: 0]) +: 4]}};
5'h06 : s_data = {<<byte {reg_mems::read_out_ram.data[int'(addr[19: 0]) +: 4]}};
5'h07 : s_data = {<<byte {reg_mems::awg_inst_ram.data[int'(addr[19: 0]) +: 4]}};
5'h08 : s_data = {<<byte {reg_mems::awg_data_ram.data[int'(addr[19: 0]) +: 4]}};
5'h09 : s_data = reg_mems::awg_regfile.data[int'(addr[19: 2])];
5'h0A : s_data = {<<byte {reg_mems::env_indx_ram.data[int'(addr[19: 0]) +: 4]}};
5'h0B : s_data = {<<byte {reg_mems::env_data_ram.data[int'(addr[19: 0]) +: 4]}};
5'h1F : s_data = reg_mems::clk_regfile.data[int'(addr[19: 2])];
endcase
//$display("s_data=%h",s_data);
return s_data;
endfunction
function single_write(bit[24: 0] start, bit[19: 0] addr, bit[31: 0] s_data);
//$display("single_write: addr=%h, s_data=%h",addr,s_data);
case(start[24:20])
5'h00 : reg_mems::sys_regfile.data[int'(addr[19: 2])] = s_data;
5'h01 : case(start[9:8])
2'b01 : reg_mems::dac_regfile.data[int'(addr[7:2])] = s_data;
2'b10 : reg_mems::adc_regfile.data[int'(addr[7:2])] = s_data;
2'b11 : reg_mems::pll_regfile.data[int'(addr[7:2])] = s_data;
endcase
5'h02 : begin
reg_mems::daq_inst_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::daq_inst_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::daq_inst_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::daq_inst_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h03 : begin
reg_mems::daq_data_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::daq_data_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::daq_data_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::daq_data_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h04 : reg_mems::daq_regfile.data[int'(addr[19: 2])] = s_data;
5'h05 : begin
reg_mems::match_filter.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::match_filter.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::match_filter.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::match_filter.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h06 : begin
reg_mems::read_out_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::read_out_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::read_out_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::read_out_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h07 : begin
reg_mems::awg_inst_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::awg_inst_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::awg_inst_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::awg_inst_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h08 : begin
reg_mems::awg_data_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::awg_data_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::awg_data_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::awg_data_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h09 : reg_mems::awg_regfile.data[int'(addr[19: 2])] = s_data;
5'h0A : begin
reg_mems::env_indx_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::env_indx_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::env_indx_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::env_indx_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h0B : begin
reg_mems::env_data_ram.data[int'(addr[19: 0])+3] = s_data[31:24];
reg_mems::env_data_ram.data[int'(addr[19: 0])+2] = s_data[23:16];
reg_mems::env_data_ram.data[int'(addr[19: 0])+1] = s_data[15: 8];
reg_mems::env_data_ram.data[int'(addr[19: 0])+0] = s_data[7 : 0];
end
5'h1F : reg_mems::clk_regfile.data[int'(addr[19: 2])] = s_data;
endcase
endfunction
function new();
endfunction
endclass