📄 wb_master_behavioral.v
字号:
/
`include "wb_model_defines.v"
`include "timescale.v"
module WB_MASTER_BEHAVIORAL
(
CLK_I,
RST_I,
TAG_I,
TAG_O,
ACK_I,
ADR_O,
CYC_O,
DAT_I,
DAT_O,
ERR_I,
RTY_I,
SEL_O,
STB_O,
WE_O,
CAB_O
);
input CLK_I;
input RST_I;
input `WB_TAG_TYPE TAG_I;
output `WB_TAG_TYPE TAG_O;
input ACK_I;
output `WB_ADDR_TYPE ADR_O;
output CYC_O;
input `WB_DATA_TYPE DAT_I;
output `WB_DATA_TYPE DAT_O;
input ERR_I;
input RTY_I;
output `WB_SEL_TYPE SEL_O;
output STB_O;
output WE_O;
output CAB_O;
// instantiate low level master module
WB_MASTER32 wbm_low_level
(
.CLK_I(CLK_I),
.RST_I(RST_I),
.TAG_I(TAG_I),
.TAG_O(TAG_O),
.ACK_I(ACK_I),
.ADR_O(ADR_O),
.CYC_O(CYC_O),
.DAT_I(DAT_I),
.DAT_O(DAT_O),
.ERR_I(ERR_I),
.RTY_I(RTY_I),
.SEL_O(SEL_O),
.STB_O(STB_O),
.WE_O(WE_O),
.CAB_O(CAB_O)
) ;
// block read and write buffers definition
// single write buffer
reg `WRITE_STIM_TYPE blk_write_data [0:(`MAX_BLK_SIZE - 1)] ;
// read stimulus buffer - addresses, tags, selects etc.
reg `READ_STIM_TYPE blk_read_data_in [0:(`MAX_BLK_SIZE - 1)] ;
// read return buffer - data and tags received while performing block reads
reg `READ_RETURN_TYPE blk_read_data_out [0:(`MAX_BLK_SIZE - 1)] ;
// single write task
task wb_single_write ;
input `WRITE_STIM_TYPE write_data ;
input `WB_TRANSFER_FLAGS write_flags ;
inout `WRITE_RETURN_TYPE return ;
reg in_use ;
reg cab ;
reg ok ;
integer cyc_count ;
integer rty_count ;
reg retry ;
begin:main
return`TB_ERROR_BIT = 1'b0 ;
cab = 0 ;
return`CYC_ACTUAL_TRANSFER = 0 ;
rty_count = 0 ;
// check if task was called before previous call finished
if ( in_use === 1 )
begin
$display("*E, wb_single_write routine re-entered! Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
in_use = 1 ;
retry = 1 ;
while (retry === 1)
begin
// synchronize operation to clock
@(posedge CLK_I) ;
wbm_low_level.start_cycle(cab, 1'b1, ok) ;
if ( ok !== 1 )
begin
$display("*E, Failed to initialize cycle! Routine wb_single_write, Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
// first insert initial wait states
cyc_count = write_flags`INIT_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
wbm_low_level.wbm_write(write_data, return) ;
if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && write_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
begin
if ( rty_count === `WB_TB_MAX_RTY )
begin
$display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_single_write, Time %t ", $time) ;
retry = 0 ;
end
else
begin
retry = 1 ;
rty_count = rty_count + 1 ;
end
end
else
retry = 0 ;
// if test bench error bit is set, there is no meaning in introducing subsequent wait states
if ( return`TB_ERROR_BIT !== 0 )
begin
@(posedge CLK_I) ;
wbm_low_level.end_cycle ;
disable main ;
end
cyc_count = write_flags`SUBSEQ_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
wbm_low_level.end_cycle ;
end
in_use = 0 ;
end //main
endtask // wb_single_write
task wb_single_read ;
input `READ_STIM_TYPE read_data ;
input `WB_TRANSFER_FLAGS read_flags ;
inout `READ_RETURN_TYPE return ;
reg in_use ;
reg cab ;
reg ok ;
integer cyc_count ;
integer rty_count ;
reg retry ;
begin:main
return`TB_ERROR_BIT = 1'b0 ;
cab = 0 ;
rty_count = 0 ;
return`CYC_ACTUAL_TRANSFER = 0 ;
// check if task was called before previous call finished
if ( in_use === 1 )
begin
$display("*E, wb_single_read routine re-entered! Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
in_use = 1 ;
retry = 1 ;
while (retry === 1)
begin
// synchronize operation to clock
@(posedge CLK_I) ;
wbm_low_level.start_cycle(cab, 1'b0, ok) ;
if ( ok !== 1 )
begin
$display("*E, Failed to initialize cycle! Routine wb_single_read, Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
// first insert initial wait states
cyc_count = read_flags`INIT_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
wbm_low_level.wbm_read(read_data, return) ;
if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && read_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
begin
if ( rty_count === `WB_TB_MAX_RTY )
begin
$display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_single_read, Time %t ", $time) ;
retry = 0 ;
end
else
begin
retry = 1 ;
rty_count = rty_count + 1 ;
end
end
else
begin
retry = 0 ;
end
// if test bench error bit is set, there is no meaning in introducing subsequent wait states
if ( return`TB_ERROR_BIT !== 0 )
begin
@(posedge CLK_I) ;
wbm_low_level.end_cycle ;
disable main ;
end
cyc_count = read_flags`SUBSEQ_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
wbm_low_level.end_cycle ;
end
in_use = 0 ;
end //main
endtask // wb_single_read
task wb_RMW_read ;
input `READ_STIM_TYPE read_data ;
input `WB_TRANSFER_FLAGS read_flags ;
inout `READ_RETURN_TYPE return ;
reg in_use ;
reg cab ;
reg ok ;
integer cyc_count ;
integer rty_count ;
reg retry ;
begin:main
return`TB_ERROR_BIT = 1'b0 ;
cab = 0 ;
rty_count = 0 ;
return`CYC_ACTUAL_TRANSFER = 0 ;
// check if task was called before previous call finished
if ( in_use === 1 )
begin
$display("*E, wb_RMW_read routine re-entered! Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
in_use = 1 ;
retry = 1 ;
while (retry === 1)
begin
// synchronize operation to clock
@(posedge CLK_I) ;
wbm_low_level.start_cycle(cab, 1'b0, ok) ;
if ( ok !== 1 )
begin
$display("*E, Failed to initialize cycle! Routine wb_RMW_read, Time %t ", $time) ;
return`TB_ERROR_BIT = 1'b1 ;
disable main ;
end
// first insert initial wait states
cyc_count = read_flags`INIT_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
wbm_low_level.wbm_read(read_data, return) ;
if ( return`CYC_ERR === 0 && return`CYC_ACK === 0 && return`CYC_RTY === 1 && read_flags`WB_TRANSFER_AUTO_RTY === 1 && return`TB_ERROR_BIT === 0)
begin
if ( rty_count === `WB_TB_MAX_RTY )
begin
$display("*E, maximum number of retries received - access will not be repeated anymore! Routine wb_RMW_read, Time %t ", $time) ;
retry = 0 ;
end
else
begin
retry = 1 ;
rty_count = rty_count + 1 ;
end
end
else
begin
retry = 0 ;
end
// if test bench error bit is set, there is no meaning in introducing subsequent wait states
if ( return`TB_ERROR_BIT !== 0 )
begin
@(posedge CLK_I) ;
wbm_low_level.end_cycle ;
disable main ;
end
cyc_count = read_flags`SUBSEQ_WAITS ;
while ( cyc_count > 0 )
begin
@(posedge CLK_I) ;
cyc_count = cyc_count - 1 ;
end
if (retry === 1)
wbm_low_level.end_cycle ;
else
wbm_low_level.modify_cycle ;
end
in_use = 0 ;
end //main
endtask // wb_RMW_read
task wb_RMW_write ;
input `WRITE_STIM_TYPE write_data ;
input `WB_TRANSFER_FLAGS write_flags ;
inout `WRITE_RETURN_TYPE return ;
reg in_use ;
reg cab ;
reg ok ;
integer cyc_count ;
integer rty_count ;
reg retry ;
begin:main
return`TB_ERROR_BIT = 1'b0 ;
cab = 0 ;
return`CYC_ACTUAL_TRANSFER = 0 ;
rty_count = 0 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -