SPI_Test/case2/spi_trans.sv

172 lines
4.9 KiB
Systemverilog

class spi_trans;
//Properties for Randomizing the MOSI
rand bit cmd;
rand bit[24:0] addr;
rand bit[ 4:0] cfgid;
rand bit[31:0] data[$];
//Properties for Randomizing the pkt_sent process
rand int interval;
rand int half_sclk;
constraint cstr {
data.size() >= 1;
data.size() <= 16;//not solid
interval <= 1000;
interval >= 0;
half_sclk <= 32;
half_sclk >= 4;
//Select system_regfile
(addr >= 25'h000_0000 &&
//addr <= 25'h000_001F &&
int'(addr) <= int'(25'h000_0023) - int'(data.size()*4) ||
addr >= 25'h000_0028 &&
//addr <= 25'h000_0037 &&
int'(addr) <= int'(25'h000_003B) - int'(data.size()*4) &&
addr != 25'h000_0020 &&
addr != 25'h000_0024) ||
(addr == 25'h000_0040) ||
//Select instruction SRAMs 8192X32bit 32KB
(addr >= 25'h010_0000 &&
//addr <= 25'h010_7FFF &&
int'(addr) <= 25'h010_8003 - data.size()*4) ||
//Select data SRAMs 8192X32bit 32KB
(addr >= 25'h020_0000 &&
//addr <= 25'h020_7FFF &&
int'(addr) <= 25'h020_8003 - data.size()*4) ||
//Select awg_regfile
(addr >= 25'h030_0000 &&
//addr <= 25'h030_001F &&
int'(addr) <= int'(25'h030_0023) - int'(data.size()*4)) ||
(addr >= 25'h030_0098 &&
//addr <= 25'h030_00A3 &&
int'(addr) <= int'(25'h030_00A7) - int'(data.size()*4)) ||
(addr >= 25'h030_0100 &&
//addr <= 25'h030_0123 &&
int'(addr) <= int'(25'h030_0127) - int'(data.size()*4)) ||
(addr >= 25'h030_0128 &&
//addr <= 25'h030_0137 &&
int'(addr) <= int'(25'h030_013B) - int'(data.size()*4)) ||
//Select envelope ID SRAMs 64X32bit 256B
(addr >= 25'h040_0000 &&
//addr <= 25'h040_00FF &&
int'(addr) <= 25'h040_0103 - data.size()*4) ||
//Select envelope data SRAMs 8192X32bit 32KB
(addr >= 25'h050_0000 &&
//addr <= 25'h050_7FFF &&
int'(addr) <= 25'h050_8003 - data.size()*4) ||
//Select dac_regfile
(addr >= 25'h060_0000 &&
//addr <= 25'h060_0073 &&
int'(addr) <= int'(25'h060_0077) - int'(data.size()*4)) ||
//Select mcu_regfile
(addr >= 25'h070_0000 &&
//addr <= 25'h070_01F &&
int'(addr) <= int'(25'h070_0023) - int'(data.size()*4)) ||
(addr >= 25'h070_0040 &&
//addr <= 25'h070_00A7 &&
int'(addr) <= int'(25'h070_00AB) - int'(data.size()*4)) ||
//Select DBG SRAMs 256X128bit 4KB
(addr >= 25'h190_0000 &&
//addr <= 25'h190_0FFF &&
int'(addr) <= 25'h190_1003 - data.size()*4) ||
//Select intpll_regfile
(addr >= 25'h1f0_0000 &&
//addr <= 25'h1f0_0057 &&
int'(addr) <= int'(25'h1f0_005B) - int'(data.size()*4)) ;
}
function new();
endfunction
extern function bit compare(spi_trans rhs_);
extern function void print(integer fid);
extern function void unpack(ref bit stream[$]);
extern function void pack(bit stream[$]);
endclass : spi_trans
function bit spi_trans::compare(spi_trans rhs_);
bit result=1'b1;
int i=0;
result = ((cmd == rhs_.cmd) &&
(addr == rhs_.addr) &&
(cfgid == rhs_.cfgid));
if(this.data.size() != rhs_.data.size()) begin
$display("data_sizes are different");
result = 1'b0;
end
else
for(i=0;i<data.size();i++)begin
if(data[i] != rhs_.data[i])
result = 1'b0;
end
return result;
endfunction : compare
function void spi_trans::print(integer fid);
int i=0;
if(!cmd)$fwrite(fid,"----------ONE-PKT-DRIVEN----------\n");
else $fwrite(fid,"---------ONE-PKT-COLLECTED--------\n");
$fwrite(fid,"cmd:\t%h\n",cmd);
$fwrite(fid,"addr:\t%h\n",addr);
$fwrite(fid,"cfgid:\t%h\n",cfgid);
for(i=0;i<data.size();i++)begin
$fwrite(fid,"data[%2d]='h%h\n",i,data[i]);
end
endfunction : print
function void spi_trans::unpack(ref bit stream[$]);
int i=0,j=0;
stream[0]=cmd;
for(i=0;i<25;i++)
stream[i+1] = addr[24-i];
for(i=0;i<5;i++)
stream[i+26]= cfgid[4-i];
stream[31]=0;
for(i=0;i<data.size();i++)begin
//$display("i=%2d,datai=%b",i,data[i]);
for(j=0;j<32;j++)begin
stream[32+i*32+j]=data[i][31-j];
//$display("i=%2d,j=%2d,streamij=%b",i,j,stream[32+i*32+j]);
end
end
endfunction
function void spi_trans::pack(bit stream[$]);
int i=0;
bit[31:0] data_temp=32'b0;
cmd = stream.pop_front();
for(i=0;i<25;i++)
addr[24-i] = stream.pop_front();
for(i=0;i<5;i++)
cfgid[4-i] = stream.pop_front();
//reserved
stream.pop_front();
while(stream.size()>0)begin
for(i=0;i<32;i++)
data_temp[31-i] = stream.pop_front();
data.push_back(data_temp);
end
endfunction