readout_rm/readout_daq_rm.sv

770 lines
33 KiB
Systemverilog
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//FILE_HEADER-------------------------------------------------------
//FILE_NAME : readout_daq_rm.sv
//DEPARTEMENT : QuantumCTek-ASIC
//AUTHOR : Yunzhuo Zhang
//TIME : 2025.3.10
//*******************************************************************
//DESCRIPTION : daq reference model define
//*******************************************************************
//END_HEADER*********************************************************
`ifndef READOUT_DAQ_RM
`define READOUT_DAQ_RM
//import uvm_pkg::*;
//import
class readout_daq_rm extends uvm_component;
`uvm_component_utils(readout_daq_rm);
virtual rm_if rm_if; //sync
uvm_blocking_get_port #(EZQ_readout_adc_item) adc_get_port; //get adc wave
uvm_blocking_get_port #(mcu_cw_item) mcu_get_port; //从mcu获取带时间戳的包包含cwtime
uvm_analysis_port #(spi_item) spi_rm2scb_port; //send spi_item
spi_item spi_item_2scb_queue[$];
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 get_mcu_cw_item();
extern task get_adc_item();
extern task daq_exe(ref bit[31:0]cw_data, ref logic[63:0]adc_wave, ref int clock_cycle, ref spi_item_2scb_queue[$]);
extern task send_spi_item();
extern task daq_block(
ref logic [31:0]i,
ref logic [31:0]cw_data ,
ref logic [31:0]func_ctrl ,
ref logic [31:0]demod_freq ,
ref logic [31:0]demod_width ,
ref logic [31:0]para_ab0 ,
ref logic [31:0]para_ab1 ,
ref logic [31:0]para_ab2 ,
ref logic [31:0]para_c0 ,
ref logic [31:0]para_c1 ,
ref logic [31:0]para_c2 ,
ref logic [1 :0]state_data ,
ref logic [31:0]iq_save_en ,
ref logic [31:0]i_sum ,
ref logic [31:0]q_sum ,
ref logic [31:0]count_save_en ,
ref logic [31:0]count_state_0 ,
ref logic [31:0]count_state_1 ,
ref logic [31:0]count_state_2 ,
ref logic [31:0]count_state_3
);
extern task dds(
ref logic [9 :0] address,
ref logic [7 :0] dds_cos[NUM_WAY-1:0],
ref logic [7 :0] dds_sin[NUM_WAY-1:0]
);
extern task data2sram(
ref logic [31:0] qubit_state ,
ref logic [31:0] state0_count [15:0],
ref logic [31:0] state1_count [15:0],
ref logic [31:0] state2_count [15:0],
ref logic [31:0] state3_count [15:0],
ref logic [31:0] i_sum [15:0],
ref logic [31:0] q_sum [15:0]
);
static int NUM_WAY = 8;
static int NUM_QUBIT = 16;
int clock_cycle ;
bit [31:0] cw_data ;
logic [63:0] adc_wave ;
endclass
function readout_daq_rm::new(string name,uvm_component parent);
super.new(name,parent);
endfunction : new
function void readout_daq_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"});
//create port
mcu_get_port = new("mcu_get_port",this);
adc_get_port = new("adc_get_port",this);
endfunction
task readout_daq_rm::get_adc_item();
EZQ_readout_adc_item EZQ_readout_adc_item;
forever begin
adc_get_port.get(EZQ_readout_adc_item);
adc_wave = EZQ_readout_adc_item.adc_wave;
`uvm_info(get_type_name(),$sformatf("mcu_cw_data = %0h",EZQ_readout_adc_item.adc_wave),UVM_LOW)
end
endtask
task readout_daq_rm::get_mcu_cw_item();
mcu_cw_item mcu_cw_item;
forever begin
mcu_get_port.get(mcu_cw_item);
clock_cycle = mcu_cw_item.clock_cycle;
cw_data = mcu_cw_item.cw_data;
`uvm_info(get_type_name(),$sformatf("daq_mcu_cw_data = %0h,daq_mcu_cycle = %0h",mcu_cw_item.cw_data,mcu_cw_item.clock_cycle),UVM_LOW)
end
endtask
task send_spi_item();
spi_item spi_item;
forever begin
if(spi_item_2scb_queue.size > 0)
spi_item = spi_item_2scb_queue.pop_front();
spi_rm2scb_port.write(spi_item);
`uvm_info(get_type_name(),$sformatf("spi_item_data = %0h",spi_item.data),UVM_LOW)
end
endtask
task readout_daq_rm::run_phase(uvm_phase phase);//main task
fork
task get_mcu_cw_item();
task get_adc_item();
task daq_exe(cw_data,clock_cycle,adc_wave);
task send_spi_item();
join
endtask
task readout_daq_rm::daq_exe(ref bit[31:0]cw_data, ref logic[63:0]adc_wave, ref int clock_cycle);
logic sync;
//DAQ reg
logic [31:0] mcu_timer;
logic [31:0] mcu_counter;
logic [31:0] loc_state;
logic [31:0] glb_state;
logic [31:0] feed_data;
logic [31:0] send_data;
logic [31:0] sram_count;
logic [31:0] push_count;
logic [31:0] command;
logic [31:0] func_ctrl;
logic [31:0] sample_depth;
logic [31:0] int_threshold;
logic [31:0] qubit_state;
logic [31:0] read_req_ctrl;
spi_item spi_item;
logic [31:0] demod_width [15:0];
logic [31:0] demod_freq [15:0];
logic [31:0] count_state_0 [15:0];
logic [31:0] count_state_1 [15:0];
logic [31:0] count_state_2 [15:0];
logic [31:0] count_state_3 [15:0];
logic [31:0] i_sum [15:0];
logic [31:0] q_sum [15:0];
logic [31:0] para_ab0 [15:0];
logic [31:0] para_ab1 [15:0];
logic [31:0] para_ab2 [15:0];
logic [31:0] para_c0 [15:0];
logic [31:0] para_c1 [15:0];
logic [31:0] para_c2 [15:0];
// sync signal
wait (`SYNC_IN);
`uvm_info(get_type_name(),"wait sync_in",UVM_LOW)
sync = rm_if.sync;
//MCU packet : get cw_data & cycle
//mcu_get_port.get(mcu_cw_item);
//clock_cycle = mcu_cw_item.clock_cycle;
//cw_data = mcu_cw_item.cw_data;
//get DAQ reg
mcu_timer = reg_mems::daq_regfile.get("timer");
mcu_counter = reg_mems::daq_regfile.get("counter");
loc_state = reg_mems::daq_regfile.get("loc_state");
glb_state = reg_mems::daq_regfile.get("glb_state");
feed_data = reg_mems::daq_regfile.get("feed_data");
send_data = reg_mems::daq_regfile.get("send_data");
sram_count = reg_mems::daq_regfile.get("sram_count");
push_count = reg_mems::daq_regfile.get("push_count");
command = reg_mems::daq_regfile.get("Command");
func_ctrl = reg_mems::daq_regfile.get("function");
sample_depth = reg_mems::daq_regfile.get("sample_depth");
int_threshold = reg_mems::daq_regfile.get("int_threshold");
// qubit_state = reg_mems::daq_regfile.get("qubit_state");
read_req_ctrl = reg_mems::daq_regfile.get("read_req_ctrl");
demod_freq[ 0] = reg_mems::daq_regfile.get("demod_freq_0");
demod_freq[ 1] = reg_mems::daq_regfile.get("demod_freq_1");
demod_freq[ 2] = reg_mems::daq_regfile.get("demod_freq_2");
demod_freq[ 3] = reg_mems::daq_regfile.get("demod_freq_3");
demod_freq[ 4] = reg_mems::daq_regfile.get("demod_freq_4");
demod_freq[ 5] = reg_mems::daq_regfile.get("demod_freq_5");
demod_freq[ 6] = reg_mems::daq_regfile.get("demod_freq_6");
demod_freq[ 7] = reg_mems::daq_regfile.get("demod_freq_7");
demod_freq[ 8] = reg_mems::daq_regfile.get("demod_freq_8");
demod_freq[ 9] = reg_mems::daq_regfile.get("demod_freq_9");
demod_freq[10] = reg_mems::daq_regfile.get("demod_freq_10");
demod_freq[11] = reg_mems::daq_regfile.get("demod_freq_11");
demod_freq[12] = reg_mems::daq_regfile.get("demod_freq_12");
demod_freq[13] = reg_mems::daq_regfile.get("demod_freq_13");
demod_freq[14] = reg_mems::daq_regfile.get("demod_freq_14");
demod_freq[15] = reg_mems::daq_regfile.get("demod_freq_15");
demod_width[ 0] = reg_mems::daq_regfile.get("demod_width_0");
demod_width[ 1] = reg_mems::daq_regfile.get("demod_width_1");
demod_width[ 2] = reg_mems::daq_regfile.get("demod_width_2");
demod_width[ 3] = reg_mems::daq_regfile.get("demod_width_3");
demod_width[ 4] = reg_mems::daq_regfile.get("demod_width_4");
demod_width[ 5] = reg_mems::daq_regfile.get("demod_width_5");
demod_width[ 6] = reg_mems::daq_regfile.get("demod_width_6");
demod_width[ 7] = reg_mems::daq_regfile.get("demod_width_7");
demod_width[ 8] = reg_mems::daq_regfile.get("demod_width_8");
demod_width[ 9] = reg_mems::daq_regfile.get("demod_width_9");
demod_width[10] = reg_mems::daq_regfile.get("demod_width_10");
demod_width[11] = reg_mems::daq_regfile.get("demod_width_11");
demod_width[12] = reg_mems::daq_regfile.get("demod_width_12");
demod_width[13] = reg_mems::daq_regfile.get("demod_width_13");
demod_width[14] = reg_mems::daq_regfile.get("demod_width_14");
demod_width[15] = reg_mems::daq_regfile.get("demod_width_15");
para_ab0[ 0] = reg_mems::daq_regfile.get("Q0_state_est_ab_0");
para_ab0[ 1] = reg_mems::daq_regfile.get("Q0_state_est_ab_1");
para_ab0[ 2] = reg_mems::daq_regfile.get("Q0_state_est_ab_2");
para_ab0[ 3] = reg_mems::daq_regfile.get("Q0_state_est_ab_3");
para_ab0[ 4] = reg_mems::daq_regfile.get("Q0_state_est_ab_4");
para_ab0[ 5] = reg_mems::daq_regfile.get("Q0_state_est_ab_5");
para_ab0[ 6] = reg_mems::daq_regfile.get("Q0_state_est_ab_6");
para_ab0[ 7] = reg_mems::daq_regfile.get("Q0_state_est_ab_7");
para_ab0[ 8] = reg_mems::daq_regfile.get("Q0_state_est_ab_8");
para_ab0[ 9] = reg_mems::daq_regfile.get("Q0_state_est_ab_9");
para_ab0[10] = reg_mems::daq_regfile.get("Q0_state_est_ab_10");
para_ab0[11] = reg_mems::daq_regfile.get("Q0_state_est_ab_11");
para_ab0[12] = reg_mems::daq_regfile.get("Q0_state_est_ab_12");
para_ab0[13] = reg_mems::daq_regfile.get("Q0_state_est_ab_13");
para_ab0[14] = reg_mems::daq_regfile.get("Q0_state_est_ab_14");
para_ab0[15] = reg_mems::daq_regfile.get("Q0_state_est_ab_15");
para_ab1[ 0] = reg_mems::daq_regfile.get("Q1_state_est_ab_0");
para_ab1[ 1] = reg_mems::daq_regfile.get("Q1_state_est_ab_1");
para_ab1[ 2] = reg_mems::daq_regfile.get("Q1_state_est_ab_2");
para_ab1[ 3] = reg_mems::daq_regfile.get("Q1_state_est_ab_3");
para_ab1[ 4] = reg_mems::daq_regfile.get("Q1_state_est_ab_4");
para_ab1[ 5] = reg_mems::daq_regfile.get("Q1_state_est_ab_5");
para_ab1[ 6] = reg_mems::daq_regfile.get("Q1_state_est_ab_6");
para_ab1[ 7] = reg_mems::daq_regfile.get("Q1_state_est_ab_7");
para_ab1[ 8] = reg_mems::daq_regfile.get("Q1_state_est_ab_8");
para_ab1[ 9] = reg_mems::daq_regfile.get("Q1_state_est_ab_9");
para_ab1[10] = reg_mems::daq_regfile.get("Q1_state_est_ab_10");
para_ab1[11] = reg_mems::daq_regfile.get("Q1_state_est_ab_11");
para_ab1[12] = reg_mems::daq_regfile.get("Q1_state_est_ab_12");
para_ab1[13] = reg_mems::daq_regfile.get("Q1_state_est_ab_13");
para_ab1[14] = reg_mems::daq_regfile.get("Q1_state_est_ab_14");
para_ab1[15] = reg_mems::daq_regfile.get("Q1_state_est_ab_15");
para_ab2[ 0] = reg_mems::daq_regfile.get("Q2_state_est_ab_0");
para_ab2[ 1] = reg_mems::daq_regfile.get("Q2_state_est_ab_1");
para_ab2[ 2] = reg_mems::daq_regfile.get("Q2_state_est_ab_2");
para_ab2[ 3] = reg_mems::daq_regfile.get("Q2_state_est_ab_3");
para_ab2[ 4] = reg_mems::daq_regfile.get("Q2_state_est_ab_4");
para_ab2[ 5] = reg_mems::daq_regfile.get("Q2_state_est_ab_5");
para_ab2[ 6] = reg_mems::daq_regfile.get("Q2_state_est_ab_6");
para_ab2[ 7] = reg_mems::daq_regfile.get("Q2_state_est_ab_7");
para_ab2[ 8] = reg_mems::daq_regfile.get("Q2_state_est_ab_8");
para_ab2[ 9] = reg_mems::daq_regfile.get("Q2_state_est_ab_9");
para_ab2[10] = reg_mems::daq_regfile.get("Q2_state_est_ab_10");
para_ab2[11] = reg_mems::daq_regfile.get("Q2_state_est_ab_11");
para_ab2[12] = reg_mems::daq_regfile.get("Q2_state_est_ab_12");
para_ab2[13] = reg_mems::daq_regfile.get("Q2_state_est_ab_13");
para_ab2[14] = reg_mems::daq_regfile.get("Q2_state_est_ab_14");
para_ab2[15] = reg_mems::daq_regfile.get("Q2_state_est_ab_15");
para_c0[ 0] = reg_mems::daq_regfile.get("Q0_state_est_c_0");
para_c0[ 1] = reg_mems::daq_regfile.get("Q0_state_est_c_1");
para_c0[ 2] = reg_mems::daq_regfile.get("Q0_state_est_c_2");
para_c0[ 3] = reg_mems::daq_regfile.get("Q0_state_est_c_3");
para_c0[ 4] = reg_mems::daq_regfile.get("Q0_state_est_c_4");
para_c0[ 5] = reg_mems::daq_regfile.get("Q0_state_est_c_5");
para_c0[ 6] = reg_mems::daq_regfile.get("Q0_state_est_c_6");
para_c0[ 7] = reg_mems::daq_regfile.get("Q0_state_est_c_7");
para_c0[ 8] = reg_mems::daq_regfile.get("Q0_state_est_c_8");
para_c0[ 9] = reg_mems::daq_regfile.get("Q0_state_est_c_9");
para_c0[10] = reg_mems::daq_regfile.get("Q0_state_est_c_10");
para_c0[11] = reg_mems::daq_regfile.get("Q0_state_est_c_11");
para_c0[12] = reg_mems::daq_regfile.get("Q0_state_est_c_12");
para_c0[13] = reg_mems::daq_regfile.get("Q0_state_est_c_13");
para_c0[14] = reg_mems::daq_regfile.get("Q0_state_est_c_14");
para_c0[15] = reg_mems::daq_regfile.get("Q0_state_est_c_15");
para_c1[ 0] = reg_mems::daq_regfile.get("Q1_state_est_c_0");
para_c1[ 1] = reg_mems::daq_regfile.get("Q1_state_est_c_1");
para_c1[ 2] = reg_mems::daq_regfile.get("Q1_state_est_c_2");
para_c1[ 3] = reg_mems::daq_regfile.get("Q1_state_est_c_3");
para_c1[ 4] = reg_mems::daq_regfile.get("Q1_state_est_c_4");
para_c1[ 5] = reg_mems::daq_regfile.get("Q1_state_est_c_5");
para_c1[ 6] = reg_mems::daq_regfile.get("Q1_state_est_c_6");
para_c1[ 7] = reg_mems::daq_regfile.get("Q1_state_est_c_7");
para_c1[ 8] = reg_mems::daq_regfile.get("Q1_state_est_c_8");
para_c1[ 9] = reg_mems::daq_regfile.get("Q1_state_est_c_9");
para_c1[10] = reg_mems::daq_regfile.get("Q1_state_est_c_10");
para_c1[11] = reg_mems::daq_regfile.get("Q1_state_est_c_11");
para_c1[12] = reg_mems::daq_regfile.get("Q1_state_est_c_12");
para_c1[13] = reg_mems::daq_regfile.get("Q1_state_est_c_13");
para_c1[14] = reg_mems::daq_regfile.get("Q1_state_est_c_14");
para_c1[15] = reg_mems::daq_regfile.get("Q1_state_est_c_15");
para_c2[ 0] = reg_mems::daq_regfile.get("Q2_state_est_c_0");
para_c2[ 1] = reg_mems::daq_regfile.get("Q2_state_est_c_1");
para_c2[ 2] = reg_mems::daq_regfile.get("Q2_state_est_c_2");
para_c2[ 3] = reg_mems::daq_regfile.get("Q2_state_est_c_3");
para_c2[ 4] = reg_mems::daq_regfile.get("Q2_state_est_c_4");
para_c2[ 5] = reg_mems::daq_regfile.get("Q2_state_est_c_5");
para_c2[ 6] = reg_mems::daq_regfile.get("Q2_state_est_c_6");
para_c2[ 7] = reg_mems::daq_regfile.get("Q2_state_est_c_7");
para_c2[ 8] = reg_mems::daq_regfile.get("Q2_state_est_c_8");
para_c2[ 9] = reg_mems::daq_regfile.get("Q2_state_est_c_9");
para_c2[10] = reg_mems::daq_regfile.get("Q2_state_est_c_10");
para_c2[11] = reg_mems::daq_regfile.get("Q2_state_est_c_11");
para_c2[12] = reg_mems::daq_regfile.get("Q2_state_est_c_12");
para_c2[13] = reg_mems::daq_regfile.get("Q2_state_est_c_13");
para_c2[14] = reg_mems::daq_regfile.get("Q2_state_est_c_14");
para_c2[15] = reg_mems::daq_regfile.get("Q2_state_est_c_15");
////////////////////////////////////////////////////////////////////
//DAQ functions
////////////////////////////////////////////////////////////////////
for(i = 0; i < NUM_QUBIT; i++)begin
fork
daq_block(
//in
.i (i ),
.cw_data (cw_data ),
.func_ctrl (func_ctrl ),
.demod_freq (demod_freq[i]),
.demod_width (demod_width[i]),
.para_ab0 (para_ab0[i]),
.para_ab1 (para_ab1[i]),
.para_ab2 (para_ab2[i]),
.para_c0 (para_c0[i]),
.para_c0 (para_c0[i]),
.para_c1 (para_c1[i]),
.para_c2 (para_c2[i]),
//out
.state_data (state_data[i]),
.iq_save_en (iq_save_valid[i]),
.i_sum (i_sum[i] ),
.q_sum (q_sum[i] ),
.count_save_en (count_save_valid[i]),
.count_state_0 (count_state_0[i]),
.count_state_1 (count_state_1[i]),
.count_state_2 (count_state_2[i]),
.count_state_3 (count_state_3[i]),
);
join
qubit_state[i*2+: 2] = state_data[i];
end
data2sram(
.qubit_state (qubit_state ),
.count_state_0 (count_state_0 ),
.count_state_1 (count_state_1 ),
.count_state_2 (count_state_2 ),
.count_state_3 (count_state_3 ),
.i_sum (i_sum ),
.q_sum (q_sum )
);
//解模数据、态状态、态统计数据通过spi_item发送给scb,目前只带数据wave未发送
spi_item.data = qubit_state;
spi_item_2scb_queue.push_back(spi_item);
foreach (count_state_0[i]) begin
spi_item.data = count_state_0[i];
spi_item_2scb_queue.push_back(spi_item);
end
foreach (count_state_1[i]) begin
spi_item.data = count_state_1[i];
spi_item_2scb_queue.push_back(spi_item);
end
foreach (count_state_2[i]) begin
spi_item.data = count_state_2[i];
spi_item_2scb_queue.push_back(spi_item);
end
foreach (count_state_3[i]) begin
spi_item.data = count_state_3[i];
spi_item_2scb_queue.push_back(spi_item);
end
foreach (i_sum[i]) begin
spi_item.data = i_sum[i];
spi_item_2scb_queue.push_back(spi_item);
end
foreach (q_sum[i]) begin
spi_item.data = q_sum[i];
spi_item_2scb_queue.push_back(spi_item);
end
endtask
task readout_daq_rm::daq_block(
logic [31:0]i ,
logic [31:0]cw_data ,
logic [31:0]func_ctrl ,
logic [31:0]demod_freq ,
logic [31:0]demod_width ,
logic [31:0]para_ab0 ,
logic [31:0]para_ab1 ,
logic [31:0]para_ab2 ,
logic [31:0]para_c0 ,
logic [31:0]para_c0 ,
logic [31:0]para_c1 ,
logic [31:0]para_c2 ,
logic [1 :0]state_data ,
logic [31:0]iq_save_en ,
logic [31:0]i_sum ,
logic [31:0]q_sum ,
logic [31:0]count_save_en ,
logic [31:0]count_state_0 ,
logic [31:0]count_state_1 ,
logic [31:0]count_state_2 ,
logic [31:0]count_state_3
);
//问题1.iq_weight存放的格式代码与设计书不吻合iq两路的解模数据存放在两个不同的ram里同一个地址给到两个ram拼接成64bit数据。
// 2.16个qubit的解模数据的读取起始地址是相同的吗
// 3.pulse_generator的作用
// 4. daq_reg已经有iq_sum,count_state等信息还要往sram里写吗
// 5. 主动数据推送是一个什么样的流程?
// 6.解模宽度demod_width和采样深度sample_width相同
// 7.代码里sub_cnt没有定义位宽
// codeword
logic demod_valid = cw_data[16+i];
logic iq_sum_en = cw_data[4] ;
logic count_add_en = cw_data[5] ;
logic loc_fb_en = cw_data[6] & !cw_data[3]) ;
logic glb_fb_en = cw_data[7] & !cw_data[3]) ;
logic iq_clr_en = cw_data[8] ;
logic count_clr_en = cw_data[9] ;
logic iq_save_en = cw_data[2:0]==3'b101) | cw_data[13]) ;
logic state_save_en = cw_data[2:0]==3'b110) | cw_data[14]) ;
logic count_save_en = cw_data[2:0]==3'b111) | cw_data[15]) ;
// mtf_gen signal
logic [7 :0] dds_cos[NUM_WAY-1 :0];
logic [7 :0] dds_sin[NUM_WAY-1 :0];
logic [2 :0] step_ctrl;
logic const_en;
logic [7 :0] weight_iq;
logic [24:0] read_addr;
logic [31:0] match_filter_i;
logic [31:0] match_filter_q;
logic [15:0] mtf_i_temp[NUM_WAY-1:0];;
logic [15:0] mtf_q_temp[NUM_WAY-1:0];;
logic [7 :0] mtf_i[NUM_WAY-1:0];;
logic [7 :0] mtf_q[NUM_WAY-1:0];;
//demod_algorithm signal
logic [15:0] demod_i;
logic [15:0] demod_q;
logic [15:0] demod_i_sum;
logic [15:0] demod_q_sum;
logic iq_valid;
//iq_sum signal
logic [15:0] scale_data_i;
logic [15:0] scale_data_q;
logic [15:0] i_sum;
logic [15:0] q_sum;
//state_estimate
logic [1 :0] state_data;
logic [31:0] count_state_0;
logic [31:0] count_state_1;
logic [31:0] count_state_2;
logic [31:0] count_state_3;
//循环次数
for(k = 0; k < demod_width ; k++)begin
//mtf_gen
//dds 每个循环出8路
logic [19:0] fcw = demod_freq[31:12];
logic [19:0] fcw_buf = {demod_freq[31:12],3'b0};
logic [19:0] pcw_buf [NUM_WAY-1 :0];
logic [19:0] accumulator [NUM_WAY-1 :0];
for(j = 0; j < NUM_WAY; j++)begin
pcw_buf[j] = {demod_freq[11:0],8'b0} + fcw*(j+1);
accumulator[j] = accumulator[j] + fcw_buf ;
address[j] = {accumulator[j]+pcw_buf[j]}[19:10];
dds(address[j],dds_cos[j][k],dds_sin[j][k]);
end
//step_ctrl解模算法步长用于控制每个权重采样点持续时钟周期
//0: 1个时钟周期
//1: 2个时钟周期
//2: 4个时钟周期
//3: 8个时钟周期
//4: 16个时钟周期
step_ctrl = func_ctrl[6:4];
const_en = func_ctrl[7];
weight_iq = func_ctrl[15:8];
if(const_en)begin
i_mult = weight_iq;
q_mult = weight_iq;
end else begin
case(step_ctrl)
3'b000 : read_addr = read_addr + 16;
3'b001 : read_addr = read_addr + 8;
3'b010 : read_addr = read_addr + 4;
3'b011 : read_addr = read_addr + 2;
3'b100 : read_addr = read_addr + 1;
defalut : read_addr = read_addr ;
reg_mems::match_filter.get32bit({read_addr[12:6],2'b0}, match_filter_i);
reg_mems::match_filter.get32bit({read_addr[12:6],2'b0}, match_filter_q);
byte_sel = read_addr[5:4];
i_mult = match_filter_i[byte_sel*8+:8];
q_mult = match_filter_q[byte_sel*8+:8];
end
for(j = 0; j < NUM_WAY; j++)begin
mtf_i_temp[j][k] = i_mult*dds_cos[j][k];
mtf_q_temp[j][k] = q_mult*dds_sin[j][k];//i和q的地址相差多少
mtf_i[j][k] = {mtf_i_temp[15][k],mtf_i_temp[14:7][k]}+mtf_i_temp[6][k];
mtf_q[j][k] = {mtf_q_temp[15][k],mtf_q_temp[14:7][k]}+mtf_q_temp[6][k];;
end
//demod_algorithm
//adc_wave = EZQ_readout_adc_item.adc_wave;
for(j = 0; j < NUM_WAY; j++)begin
demod_i[j][k] = adc_wave[j*8:j*8+7]*mtf_i[j][k];
demod_q[j][k] = adc_wave[j*8:j*8+7]*mtf_q[j][k];
//第一次求和滤掉除直流之外的频率先对demod_width长的8路数据进行求和再对8路进行求和
demod_i_queue[j].push_back(demod_i[j][k]);
demod_q_queue[j].push_back(demod_q[j][k]);
demod_i_sum = demod_i_sum + demod_i[j][k];
demod_q_sum = demod_q_sum + demod_q[j][k];
end
//求和结束valid拉高
//if(k == demod_width-1) iq_valid = 1;
end
//iq_sum
//第二次求和,对多次解模的结果求和
//分动态范围
scale_data_i = func_ctrl[3] ? demod_i_sum[31:12] : demod_i_sum[27:8];
scale_data_q = func_ctrl[3] ? demod_q_sum[31:12] : demod_q_sum[27:8];
if(iq_sum_en) begin
i_sum = i_sum + scale_data_i;
q_sum = q_sum + scale_data_q;
end
else if(iq_clr_en)begin
i_sum = 0;
q_sum = 0;
end
//state_estimate
para_a0 = para_ab0[15:0]; para_b0 = para_ab0[31:16];
para_a1 = para_ab1[15:0]; para_b1 = para_ab1[31:16];
para_a2 = para_ab2[15:0]; para_b2 = para_ab2[31:16];
if(iq_valid)begin
compare[0] = para_a0*demod_i + para_b0*demod_q <= para_c0;
compare[1] = para_a1*demod_i + para_b1*demod_q <= para_c1;
compare[2] = para_a2*demod_i + para_b2*demod_q <= para_c2;
if(compare[0][i] & (~compare[1][i])
state_data = 2'b00;
else if (compare[1][i] & (~compare[2][i])
state_data = 2'b01;
else if (compare[2][i] & (~compare[0][i])
state_data = 2'b10;
else
state_data = 2'b11;
end
//state_statistics
if(count_clr_en)begin
count_state_0 = 32'd0;
count_state_1 = 32'd0;
count_state_2 = 32'd0;
count_state_3 = 32'd0;
end
else if(count_add_en)begin
count_state_0 = (state_data == 2'b00) ? count_state_0 + 1 : count_state_0;
count_state_1 = (state_data == 2'b01) ? count_state_1 + 1 : count_state_1;
count_state_2 = (state_data == 2'b10) ? count_state_2 + 1 : count_state_2;
count_state_3 = (state_data == 2'b11) ? count_state_3 + 1 : count_state_3;
end
end
endtask
task readout_daq_rm::dds(
logic [9 :0] address,
logic [7 :0] dds_cos[NUM_WAY-1:0],
logic [7 :0] dds_sin[NUM_WAY-1:0],
);
// 系数表定义
localparam [6:0] coefficients [0:255] = '{
7'd0, 7'd1, 7'd2, 7'd2, 7'd3, 7'd4, 7'd5, 7'd5, 7'd6, 7'd7, 7'd8, 7'd9, 7'd9, 7'd10, 7'd11, 7'd12,
7'd12, 7'd13, 7'd14, 7'd15, 7'd16, 7'd16, 7'd17, 7'd18, 7'd19, 7'd19, 7'd20, 7'd21, 7'd22, 7'd23, 7'd23,
7'd24, 7'd25, 7'd26, 7'd26, 7'd27, 7'd28, 7'd29, 7'd29, 7'd30, 7'd31, 7'd32, 7'd32, 7'd33, 7'd34, 7'd35,
7'd36, 7'd36, 7'd37, 7'd38, 7'd39, 7'd39, 7'd40, 7'd41, 7'd41, 7'd42, 7'd43, 7'd44, 7'd44, 7'd45, 7'd46,
7'd47, 7'd47, 7'd48, 7'd49, 7'd50, 7'd50, 7'd51, 7'd52, 7'd52, 7'd53, 7'd54, 7'd55, 7'd55, 7'd56, 7'd57,
7'd57, 7'd58, 7'd59, 7'd59, 7'd60, 7'd61, 7'd61, 7'd62, 7'd63, 7'd64, 7'd64, 7'd65, 7'd66, 7'd66, 7'd67,
7'd68, 7'd68, 7'd69, 7'd70, 7'd70, 7'd71, 7'd71, 7'd72, 7'd73, 7'd73, 7'd74, 7'd75, 7'd75, 7'd76, 7'd77,
7'd77, 7'd78, 7'd78, 7'd79, 7'd80, 7'd80, 7'd81, 7'd81, 7'd82, 7'd83, 7'd83, 7'd84, 7'd84, 7'd85, 7'd86,
7'd86, 7'd87, 7'd87, 7'd88, 7'd88, 7'd89, 7'd90, 7'd90, 7'd91, 7'd91, 7'd92, 7'd92, 7'd93, 7'd93, 7'd94,
7'd94, 7'd95, 7'd96, 7'd96, 7'd97, 7'd97, 7'd98, 7'd98, 7'd99, 7'd99, 7'd100, 7'd100, 7'd101, 7'd101,
7'd101, 7'd102, 7'd102, 7'd103, 7'd103, 7'd104, 7'd104, 7'd105, 7'd105, 7'd106, 7'd106, 7'd106, 7'd107,
7'd107, 7'd108, 7'd108, 7'd109, 7'd109, 7'd109, 7'd110, 7'd110, 7'd111, 7'd111, 7'd111, 7'd112, 7'd112,
7'd112, 7'd113, 7'd113, 7'd114, 7'd114, 7'd114, 7'd115, 7'd115, 7'd115, 7'd116, 7'd116, 7'd116, 7'd117,
7'd117, 7'd117, 7'd117, 7'd118, 7'd118, 7'd118, 7'd119, 7'd119, 7'd119, 7'd120, 7'd120, 7'd120, 7'd120,
7'd121, 7'd121, 7'd121, 7'd121, 7'd122, 7'd122, 7'd122, 7'd122, 7'd122, 7'd123, 7'd123, 7'd123, 7'd123,
7'd123, 7'd124, 7'd124, 7'd124, 7'd124, 7'd124, 7'd125, 7'd125, 7'd125, 7'd125, 7'd125, 7'd125, 7'd125,
7'd126, 7'd126, 7'd126, 7'd126, 7'd126, 7'd126, 7'd126, 7'd126, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127,
7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127, 7'd127,
7'd127, 7'd127
};
if (address[9:8] == 2'b00) begin
dds_sin = coefficients(address[7:0]);
end
else if(address[9:8] == 2'b01) begin
dds_sin = coefficients(511-address[7:0]);
end
else if (address[9:8] == 2'b10) begin
dds_sin = -coefficients(address[7:0]-512);
end
else if(address[9:8] == 2'b11) begin
dds_sin = -coefficients(1023-address[7:0]);
end
if (address[9:8] == 2'b00) begin
dds_cos = coefficients(255-address[7:0]);
end
else if(address[9:8] == 2'b01) begin
dds_cos = -coefficients(address[7:0]-256);
end
else if (address[9:8] == 2'b10) begin
dds_cos = -coefficients(767-address[7:0]);
end
else if(address[9:8] == 2'b11) begin
dds_cos = -coefficients(address[7:0]-768);
end
endtask : dds
task readout_daq_rm::data2sram(
logic [31:0] qubit_state ,
logic [31:0] state0_count [15:0],
logic [31:0] state0_count [15:0],
logic [31:0] state1_count [15:0],
logic [31:0] state2_count [15:0],
logic [31:0] state3_count [15:0],
logic [31:0] i_sum [15:0],
logic [31:0] q_sum [15:0],
);
//将qubit_state、iq_sumcount_state写入寄存器
reg_mems::daq_regfile.set("qubit_state", qubit_state);
reg_mems::daq_regfile.set("Q0_i_sum", i_sum[0]);
reg_mems::daq_regfile.set("Q1_i_sum", i_sum[1]);
reg_mems::daq_regfile.set("Q2_i_sum", i_sum[2]);
reg_mems::daq_regfile.set("Q3_i_sum", i_sum[3]);
reg_mems::daq_regfile.set("Q4_i_sum", i_sum[4]);
reg_mems::daq_regfile.set("Q5_i_sum", i_sum[5]);
reg_mems::daq_regfile.set("Q6_i_sum", i_sum[6]);
reg_mems::daq_regfile.set("Q7_i_sum", i_sum[7]);
reg_mems::daq_regfile.set("Q8_i_sum", i_sum[8]);
reg_mems::daq_regfile.set("Q9_i_sum", i_sum[9]);
reg_mems::daq_regfile.set("Q10_i_sum", i_sum[10]);
reg_mems::daq_regfile.set("Q11_i_sum", i_sum[11]);
reg_mems::daq_regfile.set("Q12_i_sum", i_sum[12]);
reg_mems::daq_regfile.set("Q13_i_sum", i_sum[13]);
reg_mems::daq_regfile.set("Q14_i_sum", i_sum[14]);
reg_mems::daq_regfile.set("Q15_i_sum", i_sum[15]);
reg_mems::daq_regfile.set("Q0_q_sum", q_sum[0]);
reg_mems::daq_regfile.set("Q1_q_sum", q_sum[1]);
reg_mems::daq_regfile.set("Q2_q_sum", q_sum[2]);
reg_mems::daq_regfile.set("Q3_q_sum", q_sum[3]);
reg_mems::daq_regfile.set("Q4_q_sum", q_sum[4]);
reg_mems::daq_regfile.set("Q5_q_sum", q_sum[5]);
reg_mems::daq_regfile.set("Q6_q_sum", q_sum[6]);
reg_mems::daq_regfile.set("Q7_q_sum", q_sum[7]);
reg_mems::daq_regfile.set("Q8_q_sum", q_sum[8]);
reg_mems::daq_regfile.set("Q9_q_sum", q_sum[9]);
reg_mems::daq_regfile.set("Q10_q_sum", q_sum[10]);
reg_mems::daq_regfile.set("Q11_q_sum", q_sum[11]);
reg_mems::daq_regfile.set("Q12_q_sum", q_sum[12]);
reg_mems::daq_regfile.set("Q13_q_sum", q_sum[13]);
reg_mems::daq_regfile.set("Q14_q_sum", q_sum[14]);
reg_mems::daq_regfile.set("Q15_q_sum", q_sum[15]);
reg_mems::daq_regfile.set("Q0_state0_statistics", count_state_0[0]);
reg_mems::daq_regfile.set("Q1_state0_statistics", count_state_0[1]);
reg_mems::daq_regfile.set("Q2_state0_statistics", count_state_0[2]);
reg_mems::daq_regfile.set("Q3_state0_statistics", count_state_0[3]);
reg_mems::daq_regfile.set("Q4_state0_statistics", count_state_0[4]);
reg_mems::daq_regfile.set("Q5_state0_statistics", count_state_0[5]);
reg_mems::daq_regfile.set("Q6_state0_statistics", count_state_0[6]);
reg_mems::daq_regfile.set("Q7_state0_statistics", count_state_0[7]);
reg_mems::daq_regfile.set("Q8_state0_statistics", count_state_0[8]);
reg_mems::daq_regfile.set("Q9_state0_statistics", count_state_0[9]);
reg_mems::daq_regfile.set("Q10_state0_statistics", count_state_0[10]);
reg_mems::daq_regfile.set("Q11_state0_statistics", count_state_0[11]);
reg_mems::daq_regfile.set("Q12_state0_statistics", count_state_0[12]);
reg_mems::daq_regfile.set("Q13_state0_statistics", count_state_0[13]);
reg_mems::daq_regfile.set("Q14_state0_statistics", count_state_0[14]);
reg_mems::daq_regfile.set("Q15_state0_statistics", count_state_0[15]);
reg_mems::daq_regfile.set("Q0_state1_statistics", count_state_1[0]);
reg_mems::daq_regfile.set("Q1_state1_statistics", count_state_1[1]);
reg_mems::daq_regfile.set("Q2_state1_statistics", count_state_1[2]);
reg_mems::daq_regfile.set("Q3_state1_statistics", count_state_1[3]);
reg_mems::daq_regfile.set("Q4_state1_statistics", count_state_1[4]);
reg_mems::daq_regfile.set("Q5_state1_statistics", count_state_1[5]);
reg_mems::daq_regfile.set("Q6_state1_statistics", count_state_1[6]);
reg_mems::daq_regfile.set("Q7_state1_statistics", count_state_1[7]);
reg_mems::daq_regfile.set("Q8_state1_statistics", count_state_1[8]);
reg_mems::daq_regfile.set("Q9_state1_statistics", count_state_1[9]);
reg_mems::daq_regfile.set("Q10_state1_statistics", count_state_1[10]);
reg_mems::daq_regfile.set("Q11_state1_statistics", count_state_1[11]);
reg_mems::daq_regfile.set("Q12_state1_statistics", count_state_1[12]);
reg_mems::daq_regfile.set("Q13_state1_statistics", count_state_1[13]);
reg_mems::daq_regfile.set("Q14_state1_statistics", count_state_1[14]);
reg_mems::daq_regfile.set("Q15_state1_statistics", count_state_1[15]);
reg_mems::daq_regfile.set("Q0_state2_statistics", count_state_2[0]);
reg_mems::daq_regfile.set("Q1_state2_statistics", count_state_2[1]);
reg_mems::daq_regfile.set("Q2_state2_statistics", count_state_2[2]);
reg_mems::daq_regfile.set("Q3_state2_statistics", count_state_2[3]);
reg_mems::daq_regfile.set("Q4_state2_statistics", count_state_2[4]);
reg_mems::daq_regfile.set("Q5_state2_statistics", count_state_2[5]);
reg_mems::daq_regfile.set("Q6_state2_statistics", count_state_2[6]);
reg_mems::daq_regfile.set("Q7_state2_statistics", count_state_2[7]);
reg_mems::daq_regfile.set("Q8_state2_statistics", count_state_2[8]);
reg_mems::daq_regfile.set("Q9_state2_statistics", count_state_2[9]);
reg_mems::daq_regfile.set("Q10_state2_statistics", count_state_2[10]);
reg_mems::daq_regfile.set("Q11_state2_statistics", count_state_2[11]);
reg_mems::daq_regfile.set("Q12_state2_statistics", count_state_2[12]);
reg_mems::daq_regfile.set("Q13_state2_statistics", count_state_2[13]);
reg_mems::daq_regfile.set("Q14_state2_statistics", count_state_2[14]);
reg_mems::daq_regfile.set("Q15_state2_statistics", count_state_2[15]);
reg_mems::daq_regfile.set("Q0_state3_statistics", count_state_3[0]);
reg_mems::daq_regfile.set("Q1_state3_statistics", count_state_3[1]);
reg_mems::daq_regfile.set("Q2_state3_statistics", count_state_3[2]);
reg_mems::daq_regfile.set("Q3_state3_statistics", count_state_3[3]);
reg_mems::daq_regfile.set("Q4_state3_statistics", count_state_3[4]);
reg_mems::daq_regfile.set("Q5_state3_statistics", count_state_3[5]);
reg_mems::daq_regfile.set("Q6_state3_statistics", count_state_3[6]);
reg_mems::daq_regfile.set("Q7_state3_statistics", count_state_3[7]);
reg_mems::daq_regfile.set("Q8_state3_statistics", count_state_3[8]);
reg_mems::daq_regfile.set("Q9_state3_statistics", count_state_3[9]);
reg_mems::daq_regfile.set("Q10_state3_statistics", count_state_3[10]);
reg_mems::daq_regfile.set("Q11_state3_statistics", count_state_3[11]);
reg_mems::daq_regfile.set("Q12_state3_statistics", count_state_3[12]);
reg_mems::daq_regfile.set("Q13_state3_statistics", count_state_3[13]);
reg_mems::daq_regfile.set("Q14_state3_statistics", count_state_3[14]);
reg_mems::daq_regfile.set("Q15_state3_statistics", count_state_3[15]);
//将wave数据、iq_sum、qubit_state、count_state存入队列并根据需要进行推送
endtask
`endif