if ( (devsel_val !== 1'b0) ) begin
if ( (devsel_val !== 1'bz) ) begin
pdevselnn_out(1'bx, model_times.tpr_pclk_pdevselnn, -2 *`time_scale_multiplier);
end else begin
pdevselnn_out(1'bx, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
end // if
pdevselnn_out(1'b0, model_times.tpr_pclk_pdevselnn,0 *`time_scale_multiplier);
devsel_val = 1'b0;
end // if
if ( (trdy_val !== 1'b0) ) begin
if ( (trdy_val!== 1'bz) ) begin
ptrdynn_out(1'bx, model_times.tpr_pclk_ptrdynn,-2 *`time_scale_multiplier);
end else begin
ptrdynn_out(1'bx, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
end // if
ptrdynn_out(1'b0, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
trdy_val = 1'b0;
end // if
case ( config_addr )
8'b00000000 : begin
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
reg_vector = {device_id,vendor_id};
pad_out(reg_vector, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
// ad_val = reg_vector;
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG READ");
$display("");
$write("ADDRESS = ");
$write("%h",(config_addr));
$write(" (DEVICE_ID | VENDOR_ID)");
$display("");
$write("DEVICE_ID = ");
$write("%h",(reg_vector[31:16]));
$display("");
$write("VECDOR_ID = ");
$write("%h",(reg_vector[15:0]));
$display("");
$display("\"");
end
end
8'b00000100 : begin
reg_vector = {status_reg,command_reg};
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
pad_out(reg_vector, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
// ad_val = {status_reg,command_reg};
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG READ");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (STATUS | COMMAND)");
$display("");
$write("STATUS = ");
$write("%h",reg_vector[31:16]);
$display("");
$write("COMMAND = ");
$write("%h",reg_vector[15:0]);
$display("");
$display("\"");
end
end
8'b00001000 : begin
reg_vector = {class_code,revision_id};
reg_vector = {class_code,revision_id};
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
pad_out(reg_vector, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
// ad_val = {status_reg,command_reg};
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG READ");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (CLASS CODE | REVISION_ID)");
$display("");
$write("CLASS CODE = ");
$write("%h",reg_vector[31:8]);
$display("");
$write("REVISION_ID = ");
$write("%h",reg_vector[7:0]);
$display("");
$display("\"");
end
end
8'b00001100 : begin
reg_vector = {16'b0000000000000000,latency_timer_reg,cacheline_size_reg}; // 12/13/94 added cacheline size reg to config-read.
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
pad_out(reg_vector, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
// ad_val = {16'b0000000000000000,latency_timer_reg,8'b00000000};
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG READ");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (LATENCY TIMER | CACHELINE SIZE)");
$display("");
$write("LATENCY TIMER = ");
$write("%h",reg_vector[15:8]);
$display("");
$write("CACHELINE SIZE = ");
$write("%h",reg_vector[7:0]);
$display("");
$display("\"");
end
end
default begin
reg_vector = 32'b00000000000000000000000000000000;
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
pad_out(reg_vector, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
// ad_val = 32'b00000000000000000000000000000000;
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG READ");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (NOT IMPLEMENTED)");
$display("");
$write("LATENCY TIMER = ");
$write("%h",reg_vector);
$display("");
$display("\"");
end
end
endcase
end // if
end
endtask // configure_read;
task configure_write;
begin
if ( wait_one_clk ) begin // wait one clock for write cycle
wait_one_clk = `false;
// if ( INP.pclk === 1'b1 ) begin
if ( (devsel_val !== 1'b0) ) begin
if ( (devsel_val !== 1'bz) ) begin
pdevselnn_out(1'bx, model_times.tpr_pclk_pdevselnn, -2 *`time_scale_multiplier);
end else begin
pdevselnn_out(1'bx, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
end // if
pdevselnn_out(1'b0, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
devsel_val = 1'b0;
end // if
if ( (trdy_val !== 1'b0) ) begin
if ( (trdy_val!== 1'bz) ) begin
ptrdynn_out(1'bx, model_times.tpr_pclk_ptrdynn,-2 *`time_scale_multiplier);
end else begin
ptrdynn_out(1'bx, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
end // if
ptrdynn_out(1'b0, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
trdy_val = 1'b0;
end // if
// end // if
end else begin
config_cycle = `false;
// first_a = `false; // added on 10/95 by Yu
// if ( INP.pclk === 1'b1 ) begin
// if ( (devsel_val !== 1'bz) ) begin
// pdevselnn_out(1'bz, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
// devsel_val = 1'bz;
// end // if
// if ( (trdy_val !== 1'bz) ) begin
// ptrdynn_out(1'bz, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
// trdy_val = 1'bz;
// end // if
// end // if
case ( config_addr )
8'b00000100 : begin
if ( (INP.pcxbenn[0] === 1'b0) ) begin
if ( INP.pad[6] === 1'b1 ) begin
command_reg[6] = 1'b1; // set parity error response bit
end else if ( INP.pad[6] === 1'b0 ) begin
command_reg[6] = 1'b0; // reset parity error response bit
end // if
end // if
if ( (INP.pcxbenn[3] === 1'b0) ) begin
if ( INP.pad[24] === 1'b1 ) begin
status_reg[8] = 1'b0; // reset data parity detected bit
end // if
if ( INP.pad[28] === 1'b1 ) begin
status_reg[12] = 1'b0; // reset received target abort bit
end // if
if ( INP.pad[29] === 1'b1 ) begin
status_reg[13] = 1'b0; // reset received master abort bit
end // if
if ( INP.pad[31] === 1'b1 ) begin
status_reg[15] = 1'b0; // reset detected parity error bit
end // if
end // if
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG WRITE");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (STATUS | COMMAND)");
$display("");
$write("STATUS = ");
$write("%h",(status_reg));
$display("");
$write("COMMAND = ");
$write("%h",(command_reg));
$display("");
$display("\"");
end
end
8'b00001100 : begin
if ( (INP.pcxbenn[1] === 1'b0) ) begin
latency_timer_reg = INP.pad[15 : 8]; // set latency_timer bit
timeout_limit = (INP.pad[15 : 8]); // set timeout_limit
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG WRITE");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (LATENCY TIMER)");
$display("");
$write("LATENCY TIMER = ");
$write("%h",(latency_timer_reg));
$display("");
$display("\"");
end
end // if
if ( (INP.pcxbenn[0] === 1'b0) ) begin
cacheline_size_reg = INP.pad[7 : 0]; // set cacheline size register 12/13/94 (rev 2.1)
// cacheline_size_int = (INP.pad[7 : 0]);
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG WRITE");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write(" (CACHELINE SIZE)");
$display("");
$write("CACHELINE SIZE = ");
$write("%h",(cacheline_size_reg));
$display("");
$display("\"");
end
end // if
end
default begin
if (!((msg_level<`debug_1))) begin
$display("NOTE at %0t from %m",$time);
$write(" \" ");
$display("");
$write("CONFIG WRITE");
$display("");
$write("ADDRESS = ");
$write("%h",config_addr);
$write("(NOT IMPLEMENTED)");
$display("");
$write("DATA = ");
$write("%h",(INP.pad));
$display("");
$display("\"");
end
end
endcase
end // if
end
endtask // configure_write;
task config;
begin
if ( (INP.pperrnn === 1'b0) && (command_reg[6] === 1'b1) && !(last_bstate === sidle) ) begin
status_reg[8] = 1'b1; // set data parity detected bit
end // if
if ( (target_abort === 1'b1) ) begin
status_reg[12] = 1'b1; // set received target abort bit
end // if
if ( (master_abort === 1'b1) && !(cmmd === 4'b0001) ) begin
status_reg[13] = 1'b1; // set received master abort bit
end // if
if ( (INP.pperrnn === 1'b0) ) begin
status_reg[15] = 1'b1; // set detected parity error bit
end // if
// StarID #343 address_phase true only on neg edge of pframenn
if ( (INP.pframenn === 1'b0) && (pframenn_last === 1'b1) ) begin
address_phase = `true;
end // if
pframenn_last = INP.pframenn;
if ( (INP.pframenn === 1'b0) && (INP.pidsel === 1'b1) && ((INP.pcxbenn === 4'b1010) || (INP.pcxbenn === 4'b1011))
&& (bstate === sidle) && address_phase &&
((INP.pad[1 :0] === 2'b00) ||
(INP.pad[1 :0] === 2'b01 && type1_access_l))) begin
config_perr_check = `true; // to check perr on the next clock
config_cycle = `true;
// first_a = `true;
config_addr = (INP.pad[7 : 0]);
wait_one_clk = `true;
if ( (INP.pcxbenn === 4'b1010) ) begin
commd = read;
end else if ( (INP.pcxbenn === 4'b1011) ) begin
commd = write;
end // if
end // if
if ( address_phase ) begin
address_phase = `false;
end // if
if ( config_cycle && (commd === write) ) begin
configure_write;
if (!config_cycle) begin
first_a = `true; // tristate s/t/s pins
end
end
if (first_a) begin
config_par_check = `false;
config_perr_check = `false;
if ( tri_pins) begin
if (INP.pirdynn === 1'b0) begin
pdevselnn_out(1'bx, model_times.tpr_pclk_pdevselnn, -2 *`time_scale_multiplier);
pdevselnn_out(1'b1, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
ptrdynn_out(1'bx, model_times.tpr_pclk_ptrdynn, -2 *`time_scale_multiplier);
ptrdynn_out(1'b1, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
tri_pins = `false;
if (commd === read) begin
pad_out(32'hxxxxxxxx, model_times.tpr_pclk_pad, -2 *`time_scale_multiplier);
pad_out(32'hzzzzzzzz, model_times.tpr_pclk_pad, 0 *`time_scale_multiplier);
end
end
end else begin
tri_pins = `true;
first_a = `false;
pdevselnn_out(1'bz, model_times.tpr_pclk_pdevselnn, 0 *`time_scale_multiplier);
devsel_val = 1'bz;
ptrdynn_out(1'bz, model_times.tpr_pclk_ptrdynn, 0 *`time_scale_multiplier);
trdy_val = 1'bz;
end // if
end // if
if ( config_cycle && (commd === read) ) begin
configure_read;
if (!config_cycle) begin
first_a = `true; // tristate s/t/s pins on next clock edge
end
end
end
endtask // config;
task bus_machine;
begin: task_bus_machine
if (!((msg_level<`debug_3))) begin
$display("NOTE at %0t from %m",$time);
$write(" \"bus_machine");
$display("\"");
end
last_bstate = bstate;
case ( bstate )
sidle : begin
if ( (b(request) && ! b(step_local)) && ! b(INP.pgntnn) && b(INP.pframenn) &&
b(INP.pirdynn) ) begin
bstate = saddr;
end else if ( ((b(request) && b(step_local)) || ! b(request)) && ! b(INP.pgntnn) &&
b(INP.pframenn) && b(INP.pirdynn) ) begin
bstate = sdr_bus;
end else begin
bstate = sidle;
end // if
end
saddr : begin
first_64out = `true; // to control pd and pbe output when 64-bit default to 32-bit (pack64nn /= '0')
if ( addr_64 && !(second_addr) ) begin
second_addr = `true;
end else begin
bstate = sm_data;
second_addr = `false;
end // if
end
sm_data : begin
if ( cstate_rw && (INP.ptrdynn === 1'b0) ) begin
first_64out = `false; // to control pd and pbe output when 64 bit default to 32 bit (pack64nn /= '0')
end // if
if ( ! b(INP.pframenn) ||
(b(INP.pframenn) && b(INP.ptrdynn) && b(INP.pstopnn) && ! b(dev_to)) ) begin
bstate = sm_data;
end else if ( (b(request) && ! b(step_local)) && ! b(INP.pgntnn) && b(INP.pframenn) &&
! b(INP.ptrdynn) && b(l_cycle) &&
(b(back_to_back) && (b(sa) || b(fb2b_ena))) ) begin
bstate = saddr;
end else if ( (b(INP.pframenn) && ! b(INP.pstopnn)) || (b(INP.pframenn) && b(dev_to)) ) begin
bstate = ss_tar;
end else begin
bstate = sturn_ar;
end // if
end
sturn_ar : begin
if ( b(request) && ! b(step_local) && ! b(INP.pgntnn) ) begin
bstate = saddr;
end else if ( ((b(request) && b(step_local)) || ! b(request)) && ! b(INP.pgntnn) ) begin
bstate = sdr_bus;
end else if ( b(INP.pgntnn) ) begin
bstate = sidle;
end else begin
if (!((`false))) begin
$display("ERROR at %0t from %m",$time);
$write(" \"pci_master: no path out of turn_ar state");
$display("\"");
end
end // if
end
ss_tar : begin
if ( ! b(INP.pgntnn) ) begin
bstate = sdr_bus;
end else if ( b(INP.pgntnn) ) begin
bstate = sidle;
end // if
end
sdr_bus : begin
if ( ((b(request) && b(step_local)) || ! b(request)) && ! b(INP.pgntnn) ) begin
bstate = sdr_bus;
end else if ( b(request) && ! b(step_local) && ! b(INP.pgntnn) ) begin
bstate = saddr;
end else if ( b(INP.pgntnn) ) begin
bstate = sidle;
end else begin
if (!((`false))) begin
$display("ERROR at %0t from %m",$time);
$write(" \"pci_master: no path out of dr_bus state");
$display("\"");
end
end // if
end
endcase
end
endtask // bus_machine;
task irdy_oe_maker;
begin
case ( bstate )
sm_data , saddr : begin
irdy_oe = 1'b1;
end
default begin
irdy_oe = 1'b0;
end
endcase
end
endtask // irdy_oe_maker;
task irdy_maker;
begin
if ( irdy_oe === 1'b1 ) begin
if ( (irdy_val !== irdy_int) ) begin
if ( (irdy_val !== 1'bz) ) begin
pirdynn_out(1'bx, model_times.tpr_pclk_pirdynn, - 2 *`time_scale_multiplier);
end else begin
pirdynn_out(1'bx, model_times.tpr_pclk_pirdynn, 0 *`time_scale_multiplier);
end // if
pirdynn_out(irdy_int, model_times.tpr_pclk_pirdynn, 0 *`time_scale_multiplier);
irdy_val = irdy_int;
end // if
end else begin
if ( (irdy_val !== 1'bz) ) begin
pirdynn_out(1'bz, model_times.tpr_pclk_pirdynn, 0 *`time_scale_multiplier);
irdy_val = 1'bz;
end // if
end // if
end
endtask // irdy_maker;
task irdy_int_maker;
begin
if ( bstate === sm_data && (b(ready) || b(dev_to)) ) begin
irdy_int = 1'b0;
end else begin
irdy_int = 1'b1;
end // if
end
endtask // irdy_int_maker;
task req_maker;
begin
if (!((msg_level<`debug_3))) begin
$display("NOTE at %0t from %m",$time);
$write(" \"req_maker");
$display("\"");
end
if ( !(old_reset_model) ) begin
if ( ((b(request) && ! b(lock_a)) || (b(request) && b(lock_a) && lstate===free))
&& ! (bstate===ss_tar) && ! (last_bstate === ss_tar) && (enable === 1'b1) ) begin
if ( (req_val !== 1'b0) ) begin
preqnn_out(1'bx, model_times.tpr_pclk_preqnn, 0 *`time_scale_multiplier);
preqnn_out(1'b0, model_times.tpr_pclk_preqnn, 0 *`time_scale_multiplier);
req_val = 1'b0;
end // if
end else begin
if ( (req_val !== 1'b1) ) begin
preqnn_out(1'bx, model_times.tpr_pclk_preqnn, 0 *`time_scale_multiplier);
preqnn_out(1'b1, model_times.tpr_pclk_preqnn, 0 *`time_scale_multiplier);
req_val = 1'b1;
end // if
end // if
end // if
old_reset_model = reset_model;
end
endtask // req_maker;
task frame_maker;
begin
if (!((msg_level<`debug_3))) begin
$display("NOTE at %0t from %m",$time);
$write(" \"frame_maker");
$display("\"");
end
case ( bstate )
saddr , sm_data : begin
if ( (frame_val !== frame_int) ) begin
if ( (frame_val !== 1'bz) ) begin
pframenn_out(1'bx, model_times.tpr_pclk_pframenn, -2 *`time_scale_multiplier);
end else begin
pframenn_out(1'bx, model_times.tpr_pclk_pframenn, 0 *`time_scale_multiplier);
end // if
pframenn_out(frame_int, model_times.tpr_pclk_pframenn,0 *`time_scale_multiplier);
frame_val = frame_int;
if ( (bus_64) && !(retry64_32) ) begin // preq64nn follows frame_int for 64-bit extention
if ( (req64_val !== frame_int) ) begin
if ( (req64_val !== 1'bz) ) begin
preq64nn_out(1'bx, model_times.tpr_pclk_preq64nn, -2 *`time_scale_multiplier);
end else begin
preq64nn_out(1'bx, model_times.tpr_pclk_preq64nn, 0 *`time_scale_multiplier);
end // if
preq64nn_out(frame_int, model_times.tpr_pclk_preq64nn, 0 *`time_scale_multiplier);
req64_val = frame_int;
end // if
end // if
end // if
end
default begin
if ( (frame_val !== 1'bz) ) begin
pframenn_out(1'bz, model_times.tpr_pclk_pframenn,0 *`time_scale_multiplier);
frame_val = 1'bz;
end // if
if ( (req64_val !== 1'bz) ) begin
preq64nn_out(1'bz, model_times.tpr_pclk_preq64nn,0 *`time_scale_multiplier);
req64_val = 1'bz;
end // if
end
endcase
end
endtask // frame_maker;
task frame_int_maker;
begin
if ( (bstate === saddr) || ((bstate===sm_data) && ! b(dev_to) &&
((! b(comp) && ((! b(time_out)) || (! b(INP.pgntnn))) && b(INP.pstopnn)) ||
! b(ready))) ) begin
frame_int = 1'b0;
end else begin
frame_int = 1'b1;
end // if
end
endtask // frame_int_maker;
task latch_variables;
begin
latched_comp = comp;
latched_lock_a = lock_a;
latched_bstate = bstate;
end
endtask // latch_variables;
task lock_int_maker;
begin
INP.pstopnn = INP.pstopnn;
if ( (b(own_lock) && (bstate===saddr)) || (b(own_lock) && ! b(latched_lock_a) &&
b(latched_comp) && (latched_bstate===sm_data) && b(INP.pframenn) && !
b(INP.ptrdynn)) || b(target_abort) || b(master_abort) || (latched_bstate===sm_data
&& ! b(INP.pstopnn) && b(INP.ptrdynn) && ! b(lock_data_transferred)) ) begin
if ( (second_addr) ) begin
lock_int = 1'b0;
end else begin
lock_int = 1'b1;
end // if
end else begin
lock_int = 1'b0;
end // if
end
endtask // lock_int_maker;
task own_lock_maker;
begin
if ( (b(INP.plocknn) && b(INP.pframenn) && b(INP.pirdynn) && ! b(INP.preqnn)
&& ! b(INP.pgntnn) && b(lock_a)) ||
(b(own_lock) && (! b(INP.pframenn) || ! b(INP.plocknn))) ) begin
own_lock = 1'b1;
end else begin
own_lock = 1'b0;
end // if
end
endtask // own_lock_maker;
task lock_state;
begin
case ( lstate )
free : begin
if ( b(INP.plocknn) || (! b(INP.plocknn) && b(own_lock)) ) begin
lstate = free;
end else if ( ! b(INP.plocknn) && ! b(own_lock) ) begin
lstate = busy;
end // if
end
busy : begin
if ( b(INP.plocknn) && b(INP.pframenn) ) begin
lstate = free;
end else if ( ! b(INP.plocknn) || ! b(INP.pframenn) ) begin
lstate = busy;
end // if
end
endcase
end
endtask // lock_state;
task lock_maker;
begin
if ( lock_en === 1'b1 ) begin
if ( (lock_val !== lock_int) ) begin
if ( (lock_val !== 1'bz) ) begin
plocknn_out(1'bx, model_times.tpr_pclk_plocknn,-2 *`time_scale_multiplier);
end else begin
plocknn_out(1'bx, model_times.tpr_pclk_plocknn, 0 *`time_scale_multiplier);
end // if
plocknn_out(lock_int, model_times.tpr_pclk_plocknn, 0 *`time_scale_multiplier);
lock_val = lock_int;
end // if
end else begin
if ( (lock_val !== 1'bz) ) begin
plocknn_out(1'bz, model_times.tpr_pclk_plocknn, 0 *`time_scale_multiplier);
lock_val = 1'bz;
end // if
end // if
end
endtask // lock_maker;
task lock_en_maker;
begin
if ( reset_model ) begin
lock_en = 1'b0;
end else begin
if ( (b(own_lock) && (bstate===sm_data || second_addr)) ||
(b(lock_en) && ( ! b(INP.pframenn) || ! b(INP.plocknn))) ) begin
lock_en = 1'b1;
end else begin
lock_en = 1'b0;
end // if
end // if
end
endtask // lock_en_maker;
// generate a signal that keeps track of whether any data transfer
// have happened during a locked sequence. this is needed so that
// the lock# line can be deasserted if a locked access is retried
// before any data is transferred.
task lock_data;
begin
case ( lock_data_transferred )
1'b0 : begin
if ( bstate === sm_data && ! b(INP.ptrdynn) && ! b(INP.pirdynn) && b(own_lock) ) begin
lock_data_transferred = 1'b1;
end // if
end
1'b1 : begin
if ( (b(own_lock) && ! b(lock_a) && b(comp) && bstate===sm_data &&
b(INP.pframenn) && ! b(INP.ptrdynn)) ) begin
lock_data_transferred = 1'b0;
end // if
end
default begin // added for lock_data_transfered changed from bit to std_logic
lock_data_transferred = 1'b0;
end
endcase
end
endtask // lock_data;
// generate the to signal. basically this little machine
// counts whenever the bus machine is in m_data and resets itself
// whenever it is not.
task to_maker;
begin
case ( bstate )
sm_data : begin
if ( cmmd !== 4'b1111 ) begin // mem_write_inv cycle not effected by to_limit
to_counter = to_counter + 1;
end // if
if ( to_counter > timeout_limit && INP.ptrdynn === 1'b0 ) begin // trdy must be asserted
time_out = 1'b1;
end // if
end
default begin
to_counter = 0;
time_out = 1'b0;
end
endcase
end
endtask // to_maker;
// this signal goes to the backend and tells when the bus
// interface is doing address stepping.
task stepping_maker;
begin
if ( bstate === sdr_bus && ! b(INP.preqnn) ) begin
stepping = 1'b1;
end else begin
stepping = 1'b0;
end // if
end
endtask // stepping_maker;
task parity_maker;
integer pcnt;
begin
if ( ((bstate === sm_data) && (cycle_command === write)) || (bstate === saddr) || config_par_check || (bstate === sdr_bus) ) begin
pcnt = 0;
for (i = 31; i >= 0; i = i - 1) begin
if ( INP.pad[i] === 1'b1 ) begin
pcnt = pcnt + 1;
end // if
end // loop
for (i = 3; i >= 0; i = i - 1) begin
if ( INP.pcxbenn[i] === 1'b1 ) begin
pcnt = pcnt + 1;
end // if
end // loop
if ( bstate === saddr ) begin
if ( bad_addr_parity ) begin
pcnt = pcnt + 1;
end // if
end else begin
if ( bad_data_parity ) begin
pcnt = pcnt + 1;
end // if
end // if
if ( lmcver.rem(pcnt,2) === 1 ) begin
if ( (par_val !== 1'b1) ) begin
ppar_out(1'bx, model_times.tpr_pclk_ppar, 0 *`time_scale_multiplier);
ppar_out(1'b1, model_times.tpr_pclk_ppar, 0 *`time_scale_multiplier);
par_val = 1'b1;
end // if
end else begin
if ( (par_val !== 1'b0) ) begin
ppar_out(1'bx, model_times.tpr_pclk_ppar, 0 *`time_scale_multiplier);
ppar_out(1'b0, model_times.tpr_pclk_ppar, 0 *`time_scale_multiplier);
par_val = 1'b0;
end // if
end // if
end else begin
if ( (par_val !== 1'bz) ) begin
ppar_out(1'bz, model_times.tpr_pclk_ppar, 0 *`time_scale_multiplier);
par_val = 1'bz;
end // if
end // if
end
endtask // parity_maker;
task parity64_maker;
integer pcnt;
begin
if ( ((bstate === saddr) && addr_64 && (INP.preq64nn === 1'b0)) ||
((bstate === sm_data) && (cycle_command === write) && bus_64 && (INP.pdevselnn === 1'b0) && (INP.pack64nn === 1'b0)) ) begin
pcnt = 0;
for (i = 63; i >= 32; i = i - 1) begin
if ( INP.pd[i] === 1'b1 ) begin
pcnt = pcnt + 1;
end // if
end // loop
for (i = 7; i >= 4; i = i - 1) begin
if ( (INP.pbenn[i] === 1'b1) ) begin
pcnt = pcnt + 1;
end // if
end // loop
if ( bstate === saddr ) begin
if ( bad_addr_parity ) begin
pcnt = pcnt + 1;
end // if
end else begin
if ( bad_data_parity ) begin
pcnt = pcnt + 1;
end // if
end // if
if ( lmcver.rem(pcnt,2) === 1 ) begin
if ( (par64_val !== 1'b1) ) begin
ppar64_out(1'bx, model_times.tpr_pclk_ppar64, 0 *`time_scale_multiplier);
ppar64_out(1'b1, model_times.tpr_pclk_ppar64, 0 *`time_scale_multiplier);
par64_val = 1'b1;
end // if
end else begin
if ( (par64_val !== 1'b0) ) begin
ppar64_out(1'bx, model_times.tpr_pclk_ppar64, 0 *`time_scale_multiplier);
ppar64_out(1'b0, model_times.tpr_pclk_ppar64, 0 *`time_scale_multiplier);
par64_val = 1'b0;
end // if
end // if
end else begin
if ( (par64_val !== 1'bz) ) begin
ppar64_out(1'bz, model_times.tpr_pclk_ppar64, 0 *`time_scale_multiplier);
par64_val = 1'bz;
end // if
end // if
end
endtask // parity64_maker;
task parity_checker;
integer pcnt;
integer pcnt64;
begin
if ( (command_reg[6] === 1'b1) &&
(((last_bstate === sm_data) && !(last_irdy) && !(last_trdy) && (last_cycle_command === read)) || config_perr_check) ) begin
pcnt = 0;
for (i = 31; i >= 0; i = i - 1) begin
if ( last_ad[i] === 1'b1 ) begin
pcnt = pcnt + 1;
end // if
end // loop
for (i = 3; i >= 0; i = i - 1) begin
if ( last_cbe[i] === 1'b1 ) begin
pcnt = pcnt + 1;
end // if
end // loop
if ( ppar === 1'b1 ) begin // do not use inp.ppar, otherwise 'H' is filtered to '1'
pcnt = pcnt + 1;
end // if
if ( ((last_bstate === sm_data) && !(last_irdy) && !(last_trdy) && (last_cycle_command === read) &&
last_bus_64 && (last_pack64nn === 1'b0)) ) begin
pcnt64 = 0;
for (i = 63; i >= 32; i = i - 1) begin
if ( INP.pd[i] === 1'b1 ) begin
pcnt64 = pcnt64 + 1;
end // if
end // loop
for (i = 7; i >= 4; i = i - 1) begin
if ( (INP.pbenn[i] === 1'b1) ) begin
pcnt64 = pcnt64 + 1;
end // if
end // loop
if ( ppar64 === 1'b1 ) begin // do not use inp.ppar64, otherwise 'H' is filtered to '1'
pcnt64 = pcnt64 + 1;
end // if
end // if
if ( (lmcver.rem(pcnt,2) === 1) || (lmcver.rem(pcnt64,2) === 1) ) begin
if ( (perr_val !== 1'b0) ) begin
if ( (perr_val !== 1'bz) ) begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,-2 *`time_scale_multiplier);
end else begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
end // if
pperrnn_out(1'b0, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
perr_val = 1'b0;
end // if
end else begin
if ( (perr_val !== 1'b1) ) begin
if ( (perr_val !== 1'bz) ) begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,-2 *`time_scale_multiplier);
end else begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
end // if
pperrnn_out(1'b1, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
perr_val = 1'b1;
end // if
end // if
end else begin
if ( (perr_val === 1'b0) ) begin
if ( (perr_val !== 1'bz) ) begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,-2 *`time_scale_multiplier);
end else begin
pperrnn_out(1'bx, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
end // if
pperrnn_out(1'b1, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
perr_val = 1'b1;
end else if ( (perr_val !== 1'bz) ) begin
pperrnn_out(1'bz, model_times.tpr_pclk_pperrnn,0 *`time_scale_multiplier);
perr_val = 1'bz;
end // if
end // if
last_cycle_command = cycle_command;
last_bus_64 = bus_64;
last_pack64nn = INP.pack64nn;
last_trdy = b(INP.ptrdynn);
last_irdy = b(INP.pirdynn);
last_ad = (INP.pad);
last_cbe = (INP.pcxbenn);
end
endtask // parity_checker;
task dev_to_maker;
begin
if ( (INP.prstnn === 1'b0) ) begin // changed on 3/15/94 Yu
dtstate = idle;
dev_to = 1'b0;
end // if
case ( dtstate )
idle : begin
if ( last_bstate === saddr ) begin // laverty (bstate)
dtstate = counting;
if ( INP.pcxbenn === 4'b1101 ) begin
counter = 5;
end else begin
counter = 4;
end // if
end else begin
dtstate = idle;
end // if
end
counting : begin
if ( (INP.pdevselnn === 1'b0) || (INP.pdevselnn === 1'b0 /* 'L' */) ) begin
dtstate = idle;
end else begin
counter = counter - 1;
if ( counter === 0 ) begin
dev_to = 1'b1;
dtstate = timed_out;
end // if
end // if
end
timed_out : begin
if ( last_bstate === ss_tar ) begin // laverty (bstate)
dev_to = 1'b0;
dtstate = idle;
end else begin
dtstate = timed_out;
end // if
end
endcase
end
endtask // dev_to_maker;
task ad_maker;
reg [1 : 64*8] message ;
begin
case ( bstate )
saddr: begin
first_b = `true;
if ( addr_64 && !(second_addr) ) begin // dual address
if ( (d_val !== upper_addr) ) begin
if ( pd !== z_adbus ) begin
pd_out(32'hxxxxxxxx, model_times.tpr_pclk_pd, -2 *`time_scale_multiplier);
end else begin
pd_out(32'hxxxxxxxx, model_times.tpr_pclk_pd, 0 *`time_scale_multiplier);
end // if
pd_out(upper_addr, model_times.tpr_pclk_pd, 0 *`time_scale_multiplier);
d_val = upper_addr;
end // if
if ( (be_val !== (cmmd)) ) begin
if ( pbenn !== z_cxbe ) begin
pbenn_out(4'bxxxx, model_times.tpr_pclk_pbenn, -2 *`time_scale_multiplier);
end else begin
pbenn_out(4'bxxxx, model_times.tpr_pclk_pbenn, 0 *`time_scale_multiplier);
end // if
pbenn_out((cmmd), model_times.tpr_pclk_pbenn, 0 *`time_scale_multiplier);
| This page: |
Created: | Thu Aug 19 11:57:11 1999 |
| From: |
../../../sparc_v8/system/lmc/rtl/pcimaster_fm.v
|