//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