Commit 9fbfc587 authored by Tomasz Wlostowski's avatar Tomasz Wlostowski

sim/vme64x_bfm: crude MBLT model

parent 2460adc3
......@@ -8,7 +8,6 @@
`define assert_wait(name, condition, timeout) \
begin\
time t=$time; logic cond=condition;\
$display("Cond: %b %d", cond, cond != 1'bx );\
if ( (condition) != 1'b1 && (condition) != 1'b0 )\
$error ("DTACK or BERR in undefined state!");\
while(!(condition)) begin\
......@@ -289,7 +288,7 @@ class CBusAccessor_VME64x extends CBusAccessor;
a_out = { a[31:2], 2'b00};
endcase // case (xtype)
$display("SetAaddr: %x", a_out[31:2]);
// $display("SetAaddr: %x", a_out[31:2]);
vme.q_addr[31:2] = a_out[31:2];
......@@ -307,8 +306,17 @@ class CBusAccessor_VME64x extends CBusAccessor;
endtask // release_bus
/* Simple generic VME read/write: single, BLT and CSR xfers */
protected task rw_generic(bit write, uint64_t _addr, ref uint64_t _data[], input vme_addr_size_t asize, input vme_xfer_type_t xtype, vme_data_type_t dtype);
if (xtype == MBLT)
rw_mblt( write, _addr, _data, asize, xtype, dtype);
else
rw_non_mblt( write, _addr, _data, asize, xtype, dtype);
endtask // rw_generic
/* Simple generic VME read/write: single, BLT and CSR xfers */
protected task rw_non_mblt(bit write, uint64_t _addr, ref uint64_t _data[], input vme_addr_size_t asize, input vme_xfer_type_t xtype, vme_data_type_t dtype);
bit[3:0] dt;
int i;
......@@ -353,6 +361,74 @@ class CBusAccessor_VME64x extends CBusAccessor;
release_bus();
endtask // rw_generic
/* MBLT read/write */
protected task rw_mblt(bit write, uint64_t _addr, ref uint64_t _data[], input vme_addr_size_t asize, input vme_xfer_type_t xtype, vme_data_type_t dtype);
bit[3:0] dt;
int i;
// $display("DoMBLT");
`assert_wait(tmo_rws_bus_free, vme.dtack_n && vme.berr_n, 10us)
release_bus();
#40ns;
set_address(_addr, asize, xtype);
dt = dt_map[dtype];
vme.q_lword_n = dt[0];
vme.q_addr[1] = dt[1];
vme.q_write_n = !write;
#100ns;
vme.q_as_n = 0;
#40ns;
// $display("RWG %x\n", _data.size());
#100ns;
vme.q_ds_n = 0;
`assert_wait(tmo_rws_bus_free, vme.dtack_n && vme.berr_n, 10us)
#10ns;
// $display("MBLT size %d", _data.size());
for(i=0;i<_data.size();i+=2)
begin
if(write)
begin
vme.q_data = _data[i];
vme.q_addr = _data[i+1] >> 1;
vme.q_lword_n <= _data[i+1] & 1;
end
#100ns;
vme.q_ds_n = dt[3:2];
`assert_wait(tmo_rws_bus_idle, !vme.dtack_n || !vme.berr_n, 4us)
if(!vme.berr_n)
$error("[rw_simple_generic]: VME bus error.");
if(!write)
begin
_data[i] = (vme.data);
_data[i+1] = (vme.addr << 1) | (vme.lword_n);
end
#40ns;
vme.q_ds_n <= 2'b11;
#10ns;
end // for (i=0;i<_data.size();i++)
release_bus();
endtask // rw_generic
protected task extract_xtype(int s, ref vme_xfer_type_t xtype, vme_addr_size_t asize, vme_data_type_t dtype);
xtype = vme_xfer_type_t'( s & 'h0f0);
asize = vme_addr_size_t'( s & 'hf00);
......@@ -389,21 +465,26 @@ class CBusAccessor_VME64x extends CBusAccessor;
task readm(uint64_t addr[], ref uint64_t data[], input int size = m_default_modifiers, ref int result);
int i;
uint64_t tmp[];
vme_addr_size_t asize;
vme_data_type_t dtype;
vme_xfer_type_t xtype;
tmp=new[1];
extract_xtype(size, xtype, asize, dtype);
if(xtype == SINGLE || xtype == CR_CSR)
for(i=0;i<addr.size();i++)
begin
uint64_t tmp[];
tmp=new[1];
rw_generic(0, addr[i], tmp, asize, xtype, dtype);
data[i] = tmp[0];
end
if(xtype == MBLT)
rw_mblt(0, addr[0], data, asize, xtype, dtype);
endtask // readm
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment