commit 652b4c1d1a3b523891e2113d41238a1e33695da6 Author: zhangyz Date: Fri Nov 1 17:15:26 2024 +0800 first diff --git a/readout_awg_rm.sv b/readout_awg_rm.sv new file mode 100644 index 0000000..7aad31a --- /dev/null +++ b/readout_awg_rm.sv @@ -0,0 +1,446 @@ +//FILE_HEADER------------------------------------------------------- +//FILE_NAME : readout_awg_rm.sv +//DEPARTEMENT : QuantumCTek-ASIC +//AUTHOR : Yunzhuo Zhang +//TIME : 2024.10.21 +//******************************************************************* +//DESCRIPTION : awg reference model define +//******************************************************************* +//END_HEADER********************************************************* + +//问题待解决:数据类型定义 +//pulsewidth信号定义在mcu_reg中 + + +`ifdef READOUT_AWG_RM +`define READOUT_AWG_RM + +//import uvm_pkg::*; +import nco_dpi_pkg::*; +import hilbert_fir_dpi_pkg::*; + +class readout_awg_rm extends uvm_component; + virtual rm_if rm_if; //clk和sync + + uvm_blocking_get_export #(EZQ_readout_dac_item) dac_rm2scb_port; //wave输出给scoreboard + uvm_blocking_get_port #(mcu_item) mcu_get_port; //从mcu获取带时间戳的包,包含cw,time + + EZQ_readout_dac_item dac_item_pkt; + mcu_item mcu_item_pkt; + + `uvm_component_utils(readout_awg_rm); + + static int NUM_WAY = 8; + static int DATA_WIDTH = 16; + + extern function new(string name,uvm_component parent); + extern function void build_phase(uvm_phase phase); + extern virtual task run_phase(uvm_phase phase); + + extern task wave_play( //根据cw获取波形数据 + logic [5:0] wave_id, + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mem_out[$], + logic [15:0] wave_len; + + logic [15:0]time_in, + logic [15:0]time_out + ); + + extern task wave_mode( //awg算法 + logic clr_valid, //sync + logic clr_en, //cw_data[6] + logic [1 :0] mod_mode, //func_ctrl[1:0] + logic [31:0] fcw, + logic [15:0] phase, //phase[31:16] + + logic [DATA_WIDTH*NUM_WAY-1:0] wave_in, + logic [DATA_WIDTH-1:0] wave_mod_out[NUM_WAY], + + logic [15:0]time_in, + logic [15:0]time_out + ); + + extern task wave_amp( + logic [15:0] amplitude, //amp[31:16] + logic [DATA_WIDTH-1:0] wave_amp_in[NUM_WAY], + logic [DATA_WIDTH-1:0] wave_amp_out[NUM_WAY], + logic [15:0]time_in, + logic [15:0]time_out + ); + + extern task wave_mix( + logic mix_en , //~func_ctrl[2] + logic [DATA_WIDTH-1:0] wave_in[NUM_WAY], + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_out, + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_outb, + logic [15:0]time_in, + logic [15:0]time_out + ); +/* + extern task pulse_generator_pump( + logic pulse_en , + logic [15:0] delay, + logic [31:0] width, + logic inv_en , + logic [15:0] pulse + ); +*/ +endclass + +function readout_awg_rm::new(string name,uvm_component parent); + super.new(name,parent); +endfunction : new + +function void readout_awg_rm::build_phase(uvm_phase phase); + super.build_phase(phase); + if(!uvm_config_db#(virtual rm_if)::get(this,"","rm_if",rm_if)) + `uvm_fatal("CFGERR",{"virtual interface must be set for: ",get_full_name(),".vif"}); + mcu_get_port = new("spi_get_port",this); + dac_rm2scb_port = new("dac_rm2scb_port",this); +endfunction + + +task readout_awg_rm::run_phase(uvm_phase phase);//main task +//cw + logic clk; + logic [31:0] cw_data; + logic sync; +//awg config signal + logic [31:0] mcu_timer, + logic [31:0] mcu_counter, + logic [31:0] pulse_width, + + logic [31:0] amplitude, + logic [31:0] frequency, + logic [31:0] phase, + + logic [31:0] loc_state, + logic [31:0] glb_state, + logic [31:0] feed_data, +//control signal + logic [31:0] command; + logic [31:0] func_ctrl; + logic [31:0] pump_ctrl; + logic [31:0] mark_ctrl; +//get wave_idx & wave + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mem_out[$]; +//wave_mod output signal + logic [DATA_WIDTH-1:0] wave_mod_out[NUM_WAY]; +//wave_amp output siganl + logic [DATA_WIDTH-1:0] wave_amp_out[NUM_WAY]; +//wave_mix output siganl + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_out; + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_outb; +//wave_out queue + logic [DATA_WIDTH*NUM_WAY-1:0] wave_out_list[$]; + logic [DATA_WIDTH*NUM_WAY-1:0] wave_outb_list[$]; +//Pump & Mark signal + logic pump_trig; + logic mark_trig; + logic pump_delay; + logic mark_delay; + logic [15:0] pump_width; + logic [15:0] mark_width; +//时间戳,mcu_item_pkt到来时,继承pkt中的时间 + logic [15:0] time_cw; + logic [15:0] time_play; + logic [15:0] time_mode; + logic [15:0] time_amp; + logic [15:0] time_mix; + +// sync signal + sync = rm_if.sync; + +//MCU packet + mcu_get_port.get(mcu_item_pkt); + time_cw = mcu_item_pkt.clock_cycle; + cw_data = mcu_item_pkt.cw_data; + pulse_width = mcu_item_pkt.pulse_width;//该信号通过MCU的packet传送 + +//AWG reg + frequency = reg_mems::awg_regfile.get("Frequency"); + phase = reg_mems::awg_regfile.get("Phase"); + amplitude = reg_mems::awg_regfile.get("Amplitude"); + + mcu_timer = reg_mems::awg_regfile.get("Timer"); + mcu_counter = reg_mems::awg_regfile.get("Counter"); + + loc_state = reg_mems::awg_regfile.get("LOC_State"); + glb_state = reg_mems::awg_regfile.get("GLB_State"); + feed_data = reg_mems::awg_regfile.get("FEED_Data"); + + func_ctrl = reg_mems::awg_regfile.get("Function"); + command = reg_mems::awg_regfile.get("Command"); + pump_ctrl = reg_mems::awg_regfile.get("pump_ctrl"); + mark_ctrl = reg_mems::awg_regfile.get("maker_ctrl"); + +//AWG functions + wave_play( + .wave_id(cw_data[5:0]), + .wave_mem_out(wave_mem_out), + .wave_len(wave_len) + .time_in(time_cw), + .time_out(time_play) + ); + +for(k=0;k32767) iq_mod_data_i[k] = 32767; + if(iq_mod_data_i[k]<-32767) iq_mod_data_i[k] = -32767; + end + + for(k=0;k32767) iq_mod_data_q[k] = 32767; + if(iq_mod_data_q[k]<-32767) iq_mod_data_q[k] = -32767; + end + + foreach (iq_mod_data_i[index]) + $display("iq_mod_data_i is :%b",iq_mod_data_i[index]); +//mux + case(mod_mode) + 2'b00 : wave_mod_out = hilbert_in; + 2'b01 : wave_mod_out = iq_mod_data_i; + 2'b10 : wave_mod_out = hilbert_out_q; + 2'b11 : wave_mod_out = cos_list; + endcase + +task readout_awg_rm::wave_amp( + logic [15:0] amplitude, //amp[31:16] + logic [DATA_WIDTH-1:0] wave_amp_in[NUM_WAY], + logic [DATA_WIDTH-1:0] wave_amp_out[NUM_WAY], + logic [15:0]time_in, + logic [15:0]time_out +); + time_out = time_in +16'd1; + + logic [DATA_WIDTH*2-1:0]wave_amp_out_temp; + for(k=0;k32767) wave_amp_out[k] = 32767; + if(wave_amp_out[k]<-32767) wave_amp_out[k] = -32767; + end +endtask + +task wave_mix( + logic mix_en , //~func_ctrl[2] + logic [DATA_WIDTH-1:0] wave_in[NUM_WAY], + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_out, + logic [DATA_WIDTH*NUM_WAY-1:0] wave_mix_outb, + logic [15:0]time_in, + logic [15:0]time_out +); + if(mix_en) + time_out = time_in +16'd1; + else + time_out = time_in; + + for(k=0;k