172 lines
4.9 KiB
Systemverilog
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
|