URL
https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk
Subversion Repositories uart2bus_testbench
Compare Revisions
- This comparison shows the changes necessary to convert path
/uart2bus_testbench
- from Rev 1 to Rev 2
- ↔ Reverse comparison
Rev 1 → Rev 2
/trunk/rtl/uart_top.v
0,0 → 1,66
//--------------------------------------------------------------------------------------- |
// uart top level module |
// |
//--------------------------------------------------------------------------------------- |
|
module uart_top |
( |
// global signals |
clock, reset, |
// uart serial signals |
ser_in, ser_out, |
// transmit and receive internal interface signals |
rx_data, new_rx_data, |
tx_data, new_tx_data, tx_busy, |
// baud rate configuration register - see baud_gen.v for details |
baud_freq, baud_limit, |
baud_clk |
); |
//--------------------------------------------------------------------------------------- |
// modules inputs and outputs |
input clock; // global clock input |
input reset; // global reset input |
input ser_in; // serial data input |
output ser_out; // serial data output |
input [7:0] tx_data; // data byte to transmit |
input new_tx_data; // asserted to indicate that there is a new data byte for transmission |
output tx_busy; // signs that transmitter is busy |
output [7:0] rx_data; // data byte received |
output new_rx_data; // signs that a new byte was received |
input [11:0] baud_freq; // baud rate setting registers - see header description |
input [15:0] baud_limit; |
output baud_clk; |
|
// internal wires |
wire ce_16; // clock enable at bit rate |
|
assign baud_clk = ce_16; |
//--------------------------------------------------------------------------------------- |
// module implementation |
// baud rate generator module |
baud_gen baud_gen_1 |
( |
.clock(clock), .reset(reset), |
.ce_16(ce_16), .baud_freq(baud_freq), .baud_limit(baud_limit) |
); |
|
// uart receiver |
uart_rx uart_rx_1 |
( |
.clock(clock), .reset(reset), |
.ce_16(ce_16), .ser_in(ser_in), |
.rx_data(rx_data), .new_rx_data(new_rx_data) |
); |
|
// uart transmitter |
uart_tx uart_tx_1 |
( |
.clock(clock), .reset(reset), |
.ce_16(ce_16), .tx_data(tx_data), .new_tx_data(new_tx_data), |
.ser_out(ser_out), .tx_busy(tx_busy) |
); |
|
endmodule |
//--------------------------------------------------------------------------------------- |
// Th.. Th.. Th.. Thats all folks !!! |
//--------------------------------------------------------------------------------------- |
trunk/rtl/uart_top.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/rtl/baud_gen.v
===================================================================
--- trunk/rtl/baud_gen.v (nonexistent)
+++ trunk/rtl/baud_gen.v (revision 2)
@@ -0,0 +1,56 @@
+//---------------------------------------------------------------------------------------
+// baud rate generator for uart
+//
+// this module has been changed to receive the baud rate dividing counter from registers.
+// the two registers should be calculated as follows:
+// first register:
+// baud_freq = 16*baud_rate / gcd(global_clock_freq, 16*baud_rate)
+// second register:
+// baud_limit = (global_clock_freq / gcd(global_clock_freq, 16*baud_rate)) - baud_freq
+//
+//---------------------------------------------------------------------------------------
+
+module baud_gen
+(
+ clock, reset,
+ ce_16, baud_freq, baud_limit
+);
+//---------------------------------------------------------------------------------------
+// modules inputs and outputs
+input clock; // global clock input
+input reset; // global reset input
+output ce_16; // baud rate multiplyed by 16
+input [11:0] baud_freq; // baud rate setting registers - see header description
+input [15:0] baud_limit;
+
+// internal registers
+reg ce_16;
+reg [15:0] counter;
+//---------------------------------------------------------------------------------------
+// module implementation
+// baud divider counter
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ counter <= 16'b0;
+ else if (counter >= baud_limit)
+ counter <= counter - baud_limit;
+ else
+ counter <= counter + baud_freq;
+end
+
+// clock divider output
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ ce_16 <= 1'b0;
+ else if (counter >= baud_limit)
+ ce_16 <= 1'b1;
+ else
+ ce_16 <= 1'b0;
+end
+
+endmodule
+//---------------------------------------------------------------------------------------
+// Th.. Th.. Th.. Thats all folks !!!
+//---------------------------------------------------------------------------------------
trunk/rtl/baud_gen.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/rtl/uart_rx.v
===================================================================
--- trunk/rtl/uart_rx.v (nonexistent)
+++ trunk/rtl/uart_rx.v (revision 2)
@@ -0,0 +1,116 @@
+//---------------------------------------------------------------------------------------
+// uart receive module
+//
+//---------------------------------------------------------------------------------------
+
+module uart_rx
+(
+ clock, reset,
+ ce_16, ser_in,
+ rx_data, new_rx_data
+);
+//---------------------------------------------------------------------------------------
+// modules inputs and outputs
+input clock; // global clock input
+input reset; // global reset input
+input ce_16; // baud rate multiplyed by 16 - generated by baud module
+input ser_in; // serial data input
+output [7:0] rx_data; // data byte received
+output new_rx_data; // signs that a new byte was received
+
+// internal wires
+wire ce_1; // clock enable at bit rate
+wire ce_1_mid; // clock enable at the middle of each bit - used to sample data
+
+// internal registers
+reg [7:0] rx_data;
+reg new_rx_data;
+reg [1:0] in_sync;
+reg rx_busy;
+reg [3:0] count16;
+reg [3:0] bit_count;
+reg [7:0] data_buf;
+//---------------------------------------------------------------------------------------
+// module implementation
+// input async input is sampled twice
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ in_sync <= 2'b11;
+ else
+ in_sync <= {in_sync[0], ser_in};
+end
+
+// a counter to count 16 pulses of ce_16 to generate the ce_1 and ce_1_mid pulses.
+// this counter is used to detect the start bit while the receiver is not receiving and
+// signs the sampling cycle during reception.
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ count16 <= 4'b0;
+ else if (ce_16)
+ begin
+ if (rx_busy | (in_sync[1] == 1'b0))
+ count16 <= count16 + 4'b1;
+ else
+ count16 <= 4'b0;
+ end
+end
+
+// ce_1 pulse indicating expected end of current bit
+assign ce_1 = (count16 == 4'b1111) & ce_16;
+// ce_1_mid pulse indication the sampling clock cycle of the current data bit
+assign ce_1_mid = (count16 == 4'b0111) & ce_16;
+
+// receiving busy flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ rx_busy <= 1'b0;
+ else if (~rx_busy & ce_1_mid)
+ rx_busy <= 1'b1;
+ else if (rx_busy & (bit_count == 4'h8) & ce_1_mid)
+ rx_busy <= 1'b0;
+end
+
+// bit counter
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ bit_count <= 4'h0;
+ else if (~rx_busy)
+ bit_count <= 4'h0;
+ else if (rx_busy & ce_1_mid)
+ bit_count <= bit_count + 4'h1;
+end
+
+// data buffer shift register
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ data_buf <= 8'h0;
+ else if (rx_busy & ce_1_mid)
+ data_buf <= {in_sync[1], data_buf[7:1]};
+end
+
+// data output and flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ begin
+ rx_data <= 8'h0;
+ new_rx_data <= 1'b0;
+ end
+ else if (rx_busy & (bit_count == 4'h8) & ce_1)
+ begin
+ rx_data <= data_buf;
+ new_rx_data <= 1'b1;
+ end
+ else
+ new_rx_data <= 1'b0;
+end
+
+endmodule
+//---------------------------------------------------------------------------------------
+// Th.. Th.. Th.. Thats all folks !!!
+//---------------------------------------------------------------------------------------
trunk/rtl/uart_rx.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/rtl/uart_tx.v
===================================================================
--- trunk/rtl/uart_tx.v (nonexistent)
+++ trunk/rtl/uart_tx.v (revision 2)
@@ -0,0 +1,94 @@
+//---------------------------------------------------------------------------------------
+// uart transmit module
+//
+//---------------------------------------------------------------------------------------
+
+module uart_tx
+(
+ clock, reset,
+ ce_16, tx_data, new_tx_data,
+ ser_out, tx_busy
+);
+//---------------------------------------------------------------------------------------
+// modules inputs and outputs
+input clock; // global clock input
+input reset; // global reset input
+input ce_16; // baud rate multiplyed by 16 - generated by baud module
+input [7:0] tx_data; // data byte to transmit
+input new_tx_data; // asserted to indicate that there is a new data byte for transmission
+output ser_out; // serial data output
+output tx_busy; // signs that transmitter is busy
+
+// internal wires
+wire ce_1; // clock enable at bit rate
+
+// internal registers
+reg ser_out;
+reg tx_busy;
+reg [3:0] count16;
+reg [3:0] bit_count;
+reg [8:0] data_buf;
+//---------------------------------------------------------------------------------------
+// module implementation
+// a counter to count 16 pulses of ce_16 to generate the ce_1 pulse
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ count16 <= 4'b0;
+ else if (tx_busy & ce_16)
+ count16 <= count16 + 4'b1;
+ else if (~tx_busy)
+ count16 <= 4'b0;
+end
+
+// ce_1 pulse indicating output data bit should be updated
+assign ce_1 = (count16 == 4'b1111) & ce_16;
+
+// tx_busy flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ tx_busy <= 1'b0;
+ else if (~tx_busy & new_tx_data)
+ tx_busy <= 1'b1;
+ else if (tx_busy & (bit_count == 4'h9) & ce_1)
+ tx_busy <= 1'b0;
+end
+
+// output bit counter
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ bit_count <= 4'h0;
+ else if (tx_busy & ce_1)
+ bit_count <= bit_count + 4'h1;
+ else if (~tx_busy)
+ bit_count <= 4'h0;
+end
+
+// data shift register
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ data_buf <= 9'b0;
+ else if (~tx_busy)
+ data_buf <= {tx_data, 1'b0};
+ else if (tx_busy & ce_1)
+ data_buf <= {1'b1, data_buf[8:1]};
+end
+
+// output data bit
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ ser_out <= 1'b1;
+ else if (tx_busy)
+ ser_out <= data_buf[0];
+ else
+ ser_out <= 1'b1;
+end
+
+endmodule
+//---------------------------------------------------------------------------------------
+// Th.. Th.. Th.. Thats all folks !!!
+//---------------------------------------------------------------------------------------
trunk/rtl/uart_tx.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/rtl/uart_parser.v
===================================================================
--- trunk/rtl/uart_parser.v (nonexistent)
+++ trunk/rtl/uart_parser.v (revision 2)
@@ -0,0 +1,667 @@
+//---------------------------------------------------------------------------------------
+// uart parser module
+//
+//---------------------------------------------------------------------------------------
+
+module uart_parser
+(
+ // global signals
+ clock, reset,
+ // transmit and receive internal interface signals from uart interface
+ rx_data, new_rx_data,
+ tx_data, new_tx_data, tx_busy,
+ // internal bus to register file
+ int_address, int_wr_data, int_write,
+ int_rd_data, int_read,
+ int_req, int_gnt
+);
+//---------------------------------------------------------------------------------------
+// parameters
+parameter AW = 8; // address bus width parameter
+
+// modules inputs and outputs
+input clock; // global clock input
+input reset; // global reset input
+output [7:0] tx_data; // data byte to transmit
+output new_tx_data; // asserted to indicate that there is a new data byte for
+ // transmission
+input tx_busy; // signs that transmitter is busy
+input [7:0] rx_data; // data byte received
+input new_rx_data; // signs that a new byte was received
+output [AW-1:0] int_address; // address bus to register file
+output [7:0] int_wr_data; // write data to register file
+output int_write; // write control to register file
+output int_read; // read control to register file
+input [7:0] int_rd_data; // data read from register file
+output int_req; // bus access request signal
+input int_gnt; // bus access grant signal
+
+// registered outputs
+reg [7:0] tx_data;
+reg new_tx_data;
+reg [AW-1:0] int_address;
+reg [7:0] int_wr_data;
+reg write_req, read_req, int_write, int_read;
+
+// internal constants
+// define characters used by the parser
+`define CHAR_CR 8'h0d
+`define CHAR_LF 8'h0a
+`define CHAR_SPACE 8'h20
+`define CHAR_TAB 8'h09
+`define CHAR_COMMA 8'h2C
+`define CHAR_R_UP 8'h52
+`define CHAR_r_LO 8'h72
+`define CHAR_W_UP 8'h57
+`define CHAR_w_LO 8'h77
+`define CHAR_0 8'h30
+`define CHAR_1 8'h31
+`define CHAR_2 8'h32
+`define CHAR_3 8'h33
+`define CHAR_4 8'h34
+`define CHAR_5 8'h35
+`define CHAR_6 8'h36
+`define CHAR_7 8'h37
+`define CHAR_8 8'h38
+`define CHAR_9 8'h39
+`define CHAR_A_UP 8'h41
+`define CHAR_B_UP 8'h42
+`define CHAR_C_UP 8'h43
+`define CHAR_D_UP 8'h44
+`define CHAR_E_UP 8'h45
+`define CHAR_F_UP 8'h46
+`define CHAR_a_LO 8'h61
+`define CHAR_b_LO 8'h62
+`define CHAR_c_LO 8'h63
+`define CHAR_d_LO 8'h64
+`define CHAR_e_LO 8'h65
+`define CHAR_f_LO 8'h66
+
+// main (receive) state machine states
+`define MAIN_IDLE 4'b0000
+`define MAIN_WHITE1 4'b0001
+`define MAIN_DATA 4'b0010
+`define MAIN_WHITE2 4'b0011
+`define MAIN_ADDR 4'b0100
+`define MAIN_EOL 4'b0101
+// binary mode extension states
+`define MAIN_BIN_CMD 4'b1000
+`define MAIN_BIN_ADRH 4'b1001
+`define MAIN_BIN_ADRL 4'b1010
+`define MAIN_BIN_LEN 4'b1011
+`define MAIN_BIN_DATA 4'b1100
+
+// transmit state machine
+`define TX_IDLE 3'b000
+`define TX_HI_NIB 3'b001
+`define TX_LO_NIB 3'b100
+`define TX_CHAR_CR 3'b101
+`define TX_CHAR_LF 3'b110
+
+// binary extension mode commands - the command is indicated by bits 5:4 of the command byte
+`define BIN_CMD_NOP 2'b00
+`define BIN_CMD_READ 2'b01
+`define BIN_CMD_WRITE 2'b10
+
+// internal wires and registers
+reg [3:0] main_sm; // main state machine
+reg read_op; // read operation flag
+reg write_op; // write operation flag
+reg data_in_hex_range; // indicates that the received data is in the range of hex number
+reg [7:0] data_param; // operation data parameter
+reg [15:0] addr_param; // operation address parameter
+reg [3:0] data_nibble; // data nibble from received character
+reg read_done; // internally generated read done flag
+reg read_done_s; // sampled read done
+reg [7:0] read_data_s; // sampled read data
+reg [3:0] tx_nibble; // nibble value for transmission
+reg [7:0] tx_char; // transmit byte from nibble to character conversion
+reg [2:0] tx_sm; // transmit state machine
+reg s_tx_busy; // sampled tx_busy for falling edge detection
+reg bin_read_op; // binary mode read operation flag
+reg bin_write_op; // binary mode write operation flag
+reg addr_auto_inc; // address auto increment mode
+reg send_stat_flag; // send status flag
+reg [7:0] bin_byte_count; // binary mode byte counter
+wire bin_last_byte; // last byte flag indicates that the current byte in the command is the last
+wire tx_end_p; // transmission end pulse
+
+//---------------------------------------------------------------------------------------
+// module implementation
+// main state machine
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ main_sm <= `MAIN_IDLE;
+ else if (new_rx_data)
+ begin
+ case (main_sm)
+ // wait for a read ('r') or write ('w') command
+ // binary extension - an all zeros byte enabled binary commands
+ `MAIN_IDLE:
+ // check received character
+ if (rx_data == 8'h0)
+ // an all zeros received byte enters binary mode
+ main_sm <= `MAIN_BIN_CMD;
+ else if ((rx_data == `CHAR_r_LO) | (rx_data == `CHAR_R_UP))
+ // on read wait to receive only address field
+ main_sm <= `MAIN_WHITE2;
+ else if ((rx_data == `CHAR_w_LO) | (rx_data == `CHAR_W_UP))
+ // on write wait to receive data and address
+ main_sm <= `MAIN_WHITE1;
+ else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ // on new line sta in idle
+ main_sm <= `MAIN_IDLE;
+ else
+ // any other character wait to end of line (EOL)
+ main_sm <= `MAIN_EOL;
+
+ // wait for white spaces till first data nibble
+ `MAIN_WHITE1:
+ // wait in this case until any white space character is received. in any
+ // valid character for data value switch to data state. a new line or carriage
+ // return should reset the state machine to idle.
+ // any other character transitions the state machine to wait for EOL.
+ if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
+ main_sm <= `MAIN_WHITE1;
+ else if (data_in_hex_range)
+ main_sm <= `MAIN_DATA;
+ else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ main_sm <= `MAIN_IDLE;
+ else
+ main_sm <= `MAIN_EOL;
+
+ // receive data field
+ `MAIN_DATA:
+ // wait while data in hex range. white space transition to wait white 2 state.
+ // CR and LF resets the state machine. any other value cause state machine to
+ // wait til end of line.
+ if (data_in_hex_range)
+ main_sm <= `MAIN_DATA;
+ else if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
+ main_sm <= `MAIN_WHITE2;
+ else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ main_sm <= `MAIN_IDLE;
+ else
+ main_sm <= `MAIN_EOL;
+
+ // wait for white spaces till first address nibble
+ `MAIN_WHITE2:
+ // similar to MAIN_WHITE1
+ if ((rx_data == `CHAR_SPACE) | (rx_data == `CHAR_TAB))
+ main_sm <= `MAIN_WHITE2;
+ else if (data_in_hex_range)
+ main_sm <= `MAIN_ADDR;
+ else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ main_sm <= `MAIN_IDLE;
+ else
+ main_sm <= `MAIN_EOL;
+
+ // receive address field
+ `MAIN_ADDR:
+ // similar to MAIN_DATA
+ if (data_in_hex_range)
+ main_sm <= `MAIN_ADDR;
+ else if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ main_sm <= `MAIN_IDLE;
+ else
+ main_sm <= `MAIN_EOL;
+
+ // wait to EOL
+ `MAIN_EOL:
+ // wait for CR or LF to move back to idle
+ if ((rx_data == `CHAR_CR) | (rx_data == `CHAR_LF))
+ main_sm <= `MAIN_IDLE;
+
+ // binary extension
+ // wait for command - one byte
+ `MAIN_BIN_CMD:
+ // check if command is a NOP command
+ if (rx_data[5:4] == `BIN_CMD_NOP)
+ // if NOP command then switch back to idle state
+ main_sm <= `MAIN_IDLE;
+ else
+ // not a NOP command, continue receiving parameters
+ main_sm <= `MAIN_BIN_ADRH;
+
+ // wait for address parameter - two bytes
+ // high address byte
+ `MAIN_BIN_ADRH:
+ // switch to next state
+ main_sm <= `MAIN_BIN_ADRL;
+
+ // low address byte
+ `MAIN_BIN_ADRL:
+ // switch to next state
+ main_sm <= `MAIN_BIN_LEN;
+
+ // wait for length parameter - one byte
+ `MAIN_BIN_LEN:
+ // check if write command else command reception ended
+ if (bin_write_op)
+ // wait for write data
+ main_sm <= `MAIN_BIN_DATA;
+ else
+ // command reception has ended
+ main_sm <= `MAIN_IDLE;
+
+ // on write commands wait for data till end of buffer as specified by length parameter
+ `MAIN_BIN_DATA:
+ // if this is the last data byte then return to idle
+ if (bin_last_byte)
+ main_sm <= `MAIN_IDLE;
+
+ // go to idle
+ default:
+ main_sm <= `MAIN_IDLE;
+ endcase
+ end
+end
+
+// indicates that the received data is in the range of hex number
+always @ (rx_data)
+begin
+ if (((rx_data >= `CHAR_0 ) && (rx_data <= `CHAR_9 )) ||
+ ((rx_data >= `CHAR_A_UP) && (rx_data <= `CHAR_F_UP)) ||
+ ((rx_data >= `CHAR_a_LO) && (rx_data <= `CHAR_f_LO)))
+ data_in_hex_range <= 1'b1;
+ else
+ data_in_hex_range <= 1'b0;
+end
+
+// read operation flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ read_op <= 1'b0;
+ else if ((main_sm == `MAIN_IDLE) && new_rx_data)
+ begin
+ // the read operation flag is set when a read command is received in idle state and cleared
+ // if any other character is received during that state.
+ if ((rx_data == `CHAR_r_LO) | (rx_data == `CHAR_R_UP))
+ read_op <= 1'b1;
+ else
+ read_op <= 1'b0;
+ end
+end
+
+// write operation flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ write_op <= 1'b0;
+ else if ((main_sm == `MAIN_IDLE) & new_rx_data)
+ begin
+ // the write operation flag is set when a write command is received in idle state and cleared
+ // if any other character is received during that state.
+ if ((rx_data == `CHAR_w_LO) | (rx_data == `CHAR_W_UP))
+ write_op <= 1'b1;
+ else
+ write_op <= 1'b0;
+ end
+end
+
+// binary mode read operation flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ bin_read_op <= 1'b0;
+ else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_READ))
+ // read command is started on reception of a read command
+ bin_read_op <= 1'b1;
+ else if (bin_read_op && tx_end_p && bin_last_byte)
+ // read command ends on transmission of the last byte read
+ bin_read_op <= 1'b0;
+end
+
+// binary mode write operation flag
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ bin_write_op <= 1'b0;
+ else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_WRITE))
+ // write command is started on reception of a write command
+ bin_write_op <= 1'b1;
+ else if ((main_sm == `MAIN_BIN_DATA) && new_rx_data && bin_last_byte)
+ bin_write_op <= 1'b0;
+end
+
+// send status flag - used only in binary extension mode
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ send_stat_flag <= 1'b0;
+ else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data)
+ begin
+ // check if a status byte should be sent at the end of the command
+ if (rx_data[0] == 1'b1)
+ send_stat_flag <= 1'b1;
+ else
+ send_stat_flag <= 1'b0;
+ end
+end
+
+// address auto increment - used only in binary extension mode
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ addr_auto_inc <= 1'b0;
+ else if ((main_sm == `MAIN_BIN_CMD) && new_rx_data)
+ begin
+ // check if address should be automatically incremented or not.
+ // Note that when rx_data[1] is set, address auto increment is disabled.
+ if (rx_data[1] == 1'b0)
+ addr_auto_inc <= 1'b1;
+ else
+ addr_auto_inc <= 1'b0;
+ end
+end
+
+// operation data parameter
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ data_param <= 8'h0;
+ else if ((main_sm == `MAIN_WHITE1) & new_rx_data & data_in_hex_range)
+ data_param <= {4'h0, data_nibble};
+ else if ((main_sm == `MAIN_DATA) & new_rx_data & data_in_hex_range)
+ data_param <= {data_param[3:0], data_nibble};
+end
+
+// operation address parameter
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ addr_param <= 0;
+ else if ((main_sm == `MAIN_WHITE2) & new_rx_data & data_in_hex_range)
+ addr_param <= {12'b0, data_nibble};
+ else if ((main_sm == `MAIN_ADDR) & new_rx_data & data_in_hex_range)
+ addr_param <= {addr_param[11:0], data_nibble};
+ // binary extension
+ else if (main_sm == `MAIN_BIN_ADRH)
+ addr_param[15:8] <= rx_data;
+ else if (main_sm == `MAIN_BIN_ADRL)
+ addr_param[7:0] <= rx_data;
+end
+
+// binary mode command byte counter is loaded with the length parameter and counts down to zero.
+// NOTE: a value of zero for the length parameter indicates a command of 256 bytes.
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ bin_byte_count <= 8'b0;
+ else if ((main_sm == `MAIN_BIN_LEN) && new_rx_data)
+ bin_byte_count <= rx_data;
+ else if ((bin_write_op && (main_sm == `MAIN_BIN_DATA) && new_rx_data) ||
+ (bin_read_op && tx_end_p))
+ // byte counter is updated on every new data received in write operations and for every
+ // byte transmitted for read operations.
+ bin_byte_count <= bin_byte_count - 1;
+end
+// last byte in command flag
+assign bin_last_byte = (bin_byte_count == 8'h01) ? 1'b1 : 1'b0;
+
+// internal write control and data
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ begin
+ write_req <= 1'b0;
+ int_write <= 1'b0;
+ int_wr_data <= 0;
+ end
+ else if (write_op && (main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
+ begin
+ write_req <= 1'b1;
+ int_wr_data <= data_param;
+ end
+ // binary extension mode
+ else if (bin_write_op && (main_sm == `MAIN_BIN_DATA) && new_rx_data)
+ begin
+ write_req <= 1'b1;
+ int_wr_data <= rx_data;
+ end
+ else if (int_gnt && write_req)
+ begin
+ // set internal bus write and clear the write request flag
+ int_write <= 1'b1;
+ write_req <= 1'b0;
+ end
+ else
+ int_write <= 1'b0;
+end
+
+// internal read control
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ begin
+ int_read <= 1'b0;
+ read_req <= 1'b0;
+ end
+ else if (read_op && (main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
+ read_req <= 1'b1;
+ // binary extension
+ else if (bin_read_op && (main_sm == `MAIN_BIN_LEN) && new_rx_data)
+ // the first read request is issued on reception of the length byte
+ read_req <= 1'b1;
+ else if (bin_read_op && tx_end_p && !bin_last_byte)
+ // the next read requests are issued after the previous read value was transmitted and
+ // this is not the last byte to be read.
+ read_req <= 1'b1;
+ else if (int_gnt && read_req)
+ begin
+ // set internal bus read and clear the read request flag
+ int_read <= 1'b1;
+ read_req <= 1'b0;
+ end
+ else
+ int_read <= 1'b0;
+end
+
+// external request signal is active on read or write request
+assign int_req = write_req | read_req;
+
+// internal address
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ int_address <= 0;
+ else if ((main_sm == `MAIN_ADDR) && new_rx_data && !data_in_hex_range)
+ int_address <= addr_param[AW-1:0];
+ // binary extension
+ else if ((main_sm == `MAIN_BIN_LEN) && new_rx_data)
+ // sample address parameter on reception of length byte
+ int_address <= addr_param[AW-1:0];
+ else if (addr_auto_inc &&
+ ((bin_read_op && tx_end_p && !bin_last_byte) ||
+ (bin_write_op && int_write)))
+ // address is incremented on every read or write if enabled
+ int_address <= int_address + 1;
+end
+
+// read done flag and sampled data read
+always @ (posedge clock or posedge reset)
+begin
+ if (reset) begin
+ read_done <= 1'b0;
+ read_done_s <= 1'b0;
+ read_data_s <= 8'h0;
+ end
+ else
+ begin
+ // read done flag
+ if (int_read)
+ read_done <= 1'b1;
+ else
+ read_done <= 1'b0;
+
+ // sampled read done
+ read_done_s <= read_done;
+
+ // sampled data read
+ if (read_done)
+ read_data_s <= int_rd_data;
+ end
+end
+
+// transmit state machine and control
+always @ (posedge clock or posedge reset)
+begin
+ if (reset) begin
+ tx_sm <= `TX_IDLE;
+ tx_data <= 8'h0;
+ new_tx_data <= 1'b0;
+ end
+ else
+ case (tx_sm)
+ // wait for read done indication
+ `TX_IDLE:
+ // on end of every read operation check how the data read should be transmitted
+ // according to read type: ascii or binary.
+ if (read_done_s)
+ // on binary mode read transmit byte value
+ if (bin_read_op)
+ begin
+ // note that there is no need to change state
+ tx_data <= read_data_s;
+ new_tx_data <= 1'b1;
+ end
+ else
+ begin
+ tx_sm <= `TX_HI_NIB;
+ tx_data <= tx_char;
+ new_tx_data <= 1'b1;
+ end
+ // check if status byte should be transmitted
+ else if ((send_stat_flag && bin_read_op && tx_end_p && bin_last_byte) || // end of read command
+ (send_stat_flag && bin_write_op && new_rx_data && bin_last_byte) || // end of write command
+ ((main_sm == `MAIN_BIN_CMD) && new_rx_data && (rx_data[5:4] == `BIN_CMD_NOP))) // NOP
+ begin
+ // send status byte - currently a constant
+ tx_data <= 8'h5a;
+ new_tx_data <= 1'b1;
+ end
+ else
+ new_tx_data <= 1'b0;
+
+ // wait for transmit to end
+ `TX_HI_NIB:
+ if (tx_end_p)
+ begin
+ tx_sm <= `TX_LO_NIB;
+ tx_data <= tx_char;
+ new_tx_data <= 1'b1;
+ end
+ else
+ new_tx_data <= 1'b0;
+
+ // wait for transmit to end
+ `TX_LO_NIB:
+ if (tx_end_p)
+ begin
+ tx_sm <= `TX_CHAR_CR;
+ tx_data <= `CHAR_CR;
+ new_tx_data <= 1'b1;
+ end
+ else
+ new_tx_data <= 1'b0;
+
+ // wait for transmit to end
+ `TX_CHAR_CR:
+ if (tx_end_p)
+ begin
+ tx_sm <= `TX_CHAR_LF;
+ tx_data <= `CHAR_LF;
+ new_tx_data <= 1'b1;
+ end
+ else
+ new_tx_data <= 1'b0;
+
+ // wait for transmit to end
+ `TX_CHAR_LF:
+ begin
+ if (tx_end_p)
+ tx_sm <= `TX_IDLE;
+ // clear tx new data flag
+ new_tx_data <= 1'b0;
+ end
+
+ // return to idle
+ default:
+ tx_sm <= `TX_IDLE;
+ endcase
+end
+
+// select the nibble to the nibble to character conversion
+always @ (tx_sm or read_data_s)
+begin
+ case (tx_sm)
+ `TX_IDLE: tx_nibble = read_data_s[7:4];
+ `TX_HI_NIB: tx_nibble = read_data_s[3:0];
+ default: tx_nibble = read_data_s[7:4];
+ endcase
+end
+
+// sampled tx_busy
+always @ (posedge clock or posedge reset)
+begin
+ if (reset)
+ s_tx_busy <= 1'b0;
+ else
+ s_tx_busy <= tx_busy;
+end
+// tx end pulse
+assign tx_end_p = ~tx_busy & s_tx_busy;
+
+// character to nibble conversion
+always @ (rx_data)
+begin
+ case (rx_data)
+ `CHAR_0: data_nibble = 4'h0;
+ `CHAR_1: data_nibble = 4'h1;
+ `CHAR_2: data_nibble = 4'h2;
+ `CHAR_3: data_nibble = 4'h3;
+ `CHAR_4: data_nibble = 4'h4;
+ `CHAR_5: data_nibble = 4'h5;
+ `CHAR_6: data_nibble = 4'h6;
+ `CHAR_7: data_nibble = 4'h7;
+ `CHAR_8: data_nibble = 4'h8;
+ `CHAR_9: data_nibble = 4'h9;
+ `CHAR_A_UP, `CHAR_a_LO: data_nibble = 4'ha;
+ `CHAR_B_UP, `CHAR_b_LO: data_nibble = 4'hb;
+ `CHAR_C_UP, `CHAR_c_LO: data_nibble = 4'hc;
+ `CHAR_D_UP, `CHAR_d_LO: data_nibble = 4'hd;
+ `CHAR_E_UP, `CHAR_e_LO: data_nibble = 4'he;
+ `CHAR_F_UP, `CHAR_f_LO: data_nibble = 4'hf;
+ default: data_nibble = 4'hf;
+ endcase
+end
+
+// nibble to character conversion
+always @ (tx_nibble)
+begin
+ case (tx_nibble)
+ 4'h0: tx_char = `CHAR_0;
+ 4'h1: tx_char = `CHAR_1;
+ 4'h2: tx_char = `CHAR_2;
+ 4'h3: tx_char = `CHAR_3;
+ 4'h4: tx_char = `CHAR_4;
+ 4'h5: tx_char = `CHAR_5;
+ 4'h6: tx_char = `CHAR_6;
+ 4'h7: tx_char = `CHAR_7;
+ 4'h8: tx_char = `CHAR_8;
+ 4'h9: tx_char = `CHAR_9;
+ 4'ha: tx_char = `CHAR_A_UP;
+ 4'hb: tx_char = `CHAR_B_UP;
+ 4'hc: tx_char = `CHAR_C_UP;
+ 4'hd: tx_char = `CHAR_D_UP;
+ 4'he: tx_char = `CHAR_E_UP;
+ default: tx_char = `CHAR_F_UP;
+ endcase
+end
+
+endmodule
+//---------------------------------------------------------------------------------------
+// Th.. Th.. Th.. Thats all folks !!!
+//---------------------------------------------------------------------------------------
trunk/rtl/uart_parser.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/rtl/uart2bus_top.v
===================================================================
--- trunk/rtl/uart2bus_top.v (nonexistent)
+++ trunk/rtl/uart2bus_top.v (revision 2)
@@ -0,0 +1,83 @@
+//---------------------------------------------------------------------------------------
+// uart to internal bus top module
+//
+//---------------------------------------------------------------------------------------
+
+module uart2bus_top
+(
+ // global signals
+ clock, reset,
+ // uart serial signals
+ ser_in, ser_out,
+ // internal bus to register file
+ int_address, int_wr_data, int_write,
+ int_rd_data, int_read,
+ int_req, int_gnt
+);
+//---------------------------------------------------------------------------------------
+// modules inputs and outputs
+input clock; // global clock input
+input reset; // global reset input
+input ser_in; // serial data input
+output ser_out; // serial data output
+output [15:0] int_address; // address bus to register file
+output [7:0] int_wr_data; // write data to register file
+output int_write; // write control to register file
+output int_read; // read control to register file
+input [7:0] int_rd_data; // data read from register file
+output int_req; // bus access request signal
+input int_gnt; // bus access grant signal
+
+// baud rate configuration, see baud_gen.v for more details.
+// baud rate generator parameters for 115200 baud on 40MHz clock
+`define D_BAUD_FREQ 12'h90
+`define D_BAUD_LIMIT 16'h0ba5
+// baud rate generator parameters for 115200 baud on 44MHz clock
+// `define D_BAUD_FREQ 12'd23
+// `define D_BAUD_LIMIT 16'd527
+// baud rate generator parameters for 9600 baud on 66MHz clock
+//`define D_BAUD_FREQ 12'h10
+//`define D_BAUD_LIMIT 16'h1ACB
+
+// internal wires
+wire [7:0] tx_data; // data byte to transmit
+wire new_tx_data; // asserted to indicate that there is a new data byte for transmission
+wire tx_busy; // signs that transmitter is busy
+wire [7:0] rx_data; // data byte received
+wire new_rx_data; // signs that a new byte was received
+wire [11:0] baud_freq;
+wire [15:0] baud_limit;
+wire baud_clk;
+
+//---------------------------------------------------------------------------------------
+// module implementation
+// uart top module instance
+uart_top uart1
+(
+ .clock(clock), .reset(reset),
+ .ser_in(ser_in), .ser_out(ser_out),
+ .rx_data(rx_data), .new_rx_data(new_rx_data),
+ .tx_data(tx_data), .new_tx_data(new_tx_data), .tx_busy(tx_busy),
+ .baud_freq(baud_freq), .baud_limit(baud_limit),
+ .baud_clk(baud_clk)
+);
+
+// assign baud rate default values
+assign baud_freq = `D_BAUD_FREQ;
+assign baud_limit = `D_BAUD_LIMIT;
+
+// uart parser instance
+uart_parser #(16) uart_parser1
+(
+ .clock(clock), .reset(reset),
+ .rx_data(rx_data), .new_rx_data(new_rx_data),
+ .tx_data(tx_data), .new_tx_data(new_tx_data), .tx_busy(tx_busy),
+ .int_address(int_address), .int_wr_data(int_wr_data), .int_write(int_write),
+ .int_rd_data(int_rd_data), .int_read(int_read),
+ .int_req(int_req), .int_gnt(int_gnt)
+);
+
+endmodule
+//---------------------------------------------------------------------------------------
+// Th.. Th.. Th.. Thats all folks !!!
+//---------------------------------------------------------------------------------------
trunk/rtl/uart2bus_top.v
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.layout
===================================================================
--- trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.layout (nonexistent)
+++ trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.layout (revision 2)
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.layout
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/buad_rate_calculation/buad_rate_calculations/main.cpp
===================================================================
--- trunk/buad_rate_calculation/buad_rate_calculations/main.cpp (nonexistent)
+++ trunk/buad_rate_calculation/buad_rate_calculations/main.cpp (revision 2)
@@ -0,0 +1,47 @@
+#include
+
+using namespace std;
+
+int gcd_calc (int x, int y);
+
+int main()
+{
+ unsigned int gcd_result;
+ unsigned int buad_rate,buad_freq,global_clock;
+ cout << "enter buad rate" << endl;
+ cin >> buad_rate ;
+ cout << "enter global clock" << endl;
+ cin >> global_clock ;
+ gcd_result = gcd_calc(global_clock,(16*buad_rate));
+ buad_freq = (16*buad_rate)/gcd_result;
+ cout << "buad_freq = " << buad_freq << endl;
+
+ return 0;
+}
+
+int gcd_calc(int x, int y)
+{
+ int result =1;
+ bool break_loop = false;
+ int div;
+ div =2;
+ while (break_loop == false)
+ {
+ if ((x%div == 0) && (y%div ==0))
+ {
+ result = result*div;
+ x=x/div;
+ y=y/div;
+ }
+ else
+ {
+ div++;
+ }
+ if((div > x)|| (div > y))
+ {
+ break_loop = true;
+ }
+ }
+ return result;
+}
+
trunk/buad_rate_calculation/buad_rate_calculations/main.cpp
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.depend
===================================================================
--- trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.depend (nonexistent)
+++ trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.depend (revision 2)
@@ -0,0 +1,4 @@
+# depslib dependency file v1.0
+1452501572 source:c:\users\pc2\uart2bus\uvm_testbench\buad_rate_calculation\buad_rate_calculations\main.cpp
+
+
trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.depend
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe
===================================================================
--- trunk/buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe (nonexistent)
+++ trunk/buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe (revision 2)
trunk/buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.cbp
===================================================================
--- trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.cbp (nonexistent)
+++ trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.cbp (revision 2)
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
trunk/buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.cbp
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/doc/uart2bus_tb.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_tb.png
===================================================================
--- trunk/doc/uart2bus_tb.png (nonexistent)
+++ trunk/doc/uart2bus_tb.png (revision 2)
trunk/doc/uart2bus_tb.png
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_verification_plan.docx
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_verification_plan.docx
===================================================================
--- trunk/doc/uart2bus_verification_plan.docx (nonexistent)
+++ trunk/doc/uart2bus_verification_plan.docx (revision 2)
trunk/doc/uart2bus_verification_plan.docx
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_tb.jpeg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_tb.jpeg
===================================================================
--- trunk/doc/uart2bus_tb.jpeg (nonexistent)
+++ trunk/doc/uart2bus_tb.jpeg (revision 2)
trunk/doc/uart2bus_tb.jpeg
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_core.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_core.png
===================================================================
--- trunk/doc/uart2bus_core.png (nonexistent)
+++ trunk/doc/uart2bus_core.png (revision 2)
trunk/doc/uart2bus_core.png
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_core.jpeg
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_core.jpeg
===================================================================
--- trunk/doc/uart2bus_core.jpeg (nonexistent)
+++ trunk/doc/uart2bus_core.jpeg (revision 2)
trunk/doc/uart2bus_core.jpeg
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_tb.dia
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_tb.dia
===================================================================
--- trunk/doc/uart2bus_tb.dia (nonexistent)
+++ trunk/doc/uart2bus_tb.dia (revision 2)
trunk/doc/uart2bus_tb.dia
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_verification_plan.odt
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_verification_plan.odt
===================================================================
--- trunk/doc/uart2bus_verification_plan.odt (nonexistent)
+++ trunk/doc/uart2bus_verification_plan.odt (revision 2)
trunk/doc/uart2bus_verification_plan.odt
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_tb.svg
===================================================================
--- trunk/doc/uart2bus_tb.svg (nonexistent)
+++ trunk/doc/uart2bus_tb.svg (revision 2)
@@ -0,0 +1,386 @@
+
+
trunk/doc/uart2bus_tb.svg
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/doc/uart2bus_core.dia
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_core.dia
===================================================================
--- trunk/doc/uart2bus_core.dia (nonexistent)
+++ trunk/doc/uart2bus_core.dia (revision 2)
trunk/doc/uart2bus_core.dia
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/uart2bus_verification_plan.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/uart2bus_verification_plan.pdf
===================================================================
--- trunk/doc/uart2bus_verification_plan.pdf (nonexistent)
+++ trunk/doc/uart2bus_verification_plan.pdf (revision 2)
trunk/doc/uart2bus_verification_plan.pdf
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/UART to Bus Core Specifications.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: trunk/doc/UART to Bus Core Specifications.pdf
===================================================================
--- trunk/doc/UART to Bus Core Specifications.pdf (nonexistent)
+++ trunk/doc/UART to Bus Core Specifications.pdf (revision 2)
trunk/doc/UART to Bus Core Specifications.pdf
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/doc/.~lock.uart2bus_verification_plan.odt#
===================================================================
--- trunk/doc/.~lock.uart2bus_verification_plan.odt# (nonexistent)
+++ trunk/doc/.~lock.uart2bus_verification_plan.odt# (revision 2)
@@ -0,0 +1 @@
+,hany,hany-Inspiron-3542,24.01.2016 23:03,file:///home/hany/.config/libreoffice/4;
\ No newline at end of file
trunk/doc/.~lock.uart2bus_verification_plan.odt#
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/test/uart_test.svh
===================================================================
--- trunk/tb/test/uart_test.svh (nonexistent)
+++ trunk/tb/test/uart_test.svh (revision 2)
@@ -0,0 +1,317 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : TEST
+//-----------------------------------------------------------------------------
+// TITLE : UART TEST
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 10012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+class uart_base_test extends uvm_test;
+
+ uart_env env;
+
+ uvm_table_printer printer;
+
+ uart_config _config;
+
+ `uvm_component_utils(uart_base_test)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase(phase);
+
+ env = uart_env::type_id::create("env",this);
+
+ _config = uart_config::type_id::create("_config",this);
+
+ uvm_config_db#(uart_config)::set(this,"*","UART_CONFIGURATION",_config);
+
+ printer = new();
+ printer.knobs.depth = 3;
+ endfunction:build_phase
+
+ function void connect_phase (uvm_phase phase);
+ super.connect_phase(phase);
+ endfunction:connect_phase
+
+ function void end_of_elaboration_phase (uvm_phase phase);
+ super.end_of_elaboration_phase(phase);
+ _config._edge = pos_edge;
+ _config._start = lsb;
+ _config._datamode = ascii;
+ _config.num_stop_bits = 1;
+ _config.num_of_bits = 8;
+ _config._paritymode = parity_off;
+ _config.response_time = 10000;
+ endfunction:end_of_elaboration_phase
+
+ task run_phase (uvm_phase phase);
+ phase.phase_done.set_drain_time(this,5000);
+ endtask:run_phase
+endclass:uart_base_test
+
+
+class write_text_mode extends uart_base_test;
+
+ seq_1p1 seq1;
+ seq_1p2 seq2;
+ seq_1p3 seq3;
+ seq_1p4 seq4;
+ seq_1p5 seq5;
+ seq_1p6 seq6;
+ seq_1p7 seq7;
+ seq_1p8 seq8;
+ seq_1p9 seq9;
+ seq_1p10 seq10;
+ seq_1p11 seq11;
+
+ `uvm_component_utils(write_text_mode)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase (phase);
+ seq1 = seq_1p1::type_id::create("seq1");
+ seq2 = seq_1p2::type_id::create("seq2");
+ seq3 = seq_1p3::type_id::create("seq3");
+ seq4 = seq_1p4::type_id::create("seq4");
+ seq5 = seq_1p5::type_id::create("seq5");
+ seq6 = seq_1p6::type_id::create("seq6");
+ seq7 = seq_1p7::type_id::create("seq7");
+ seq8 = seq_1p8::type_id::create("seq8");
+ seq9 = seq_1p9::type_id::create("seq9");
+ seq10 = seq_1p10::type_id::create("seq10");
+ seq11 = seq_1p11::type_id::create("seq11");
+ endfunction:build_phase
+
+
+ task run_phase (uvm_phase phase);
+ super.run_phase(phase);
+ phase.raise_objection(this);
+ seq1.start(env.agent._seq,null);
+ seq2.start(env.agent._seq,null);
+ seq3.start(env.agent._seq,null);
+ seq4.start(env.agent._seq,null);
+ seq5.start(env.agent._seq,null);
+ seq6.start(env.agent._seq,null);
+ seq7.start(env.agent._seq,null);
+ seq8.start(env.agent._seq,null);
+ seq9.start(env.agent._seq,null);
+ seq10.start(env.agent._seq,null);
+ seq11.start(env.agent._seq,null);
+ phase.drop_objection(this);
+ endtask:run_phase
+endclass:write_text_mode
+
+
+class read_text_mode extends uart_base_test;
+
+ seq_2p1 seq1;
+ seq_2p2 seq2;
+ seq_2p3 seq3;
+ seq_2p4 seq4;
+ seq_2p5 seq5;
+ seq_2p6 seq6;
+ seq_2p7 seq7;
+ seq_2p8 seq8;
+ seq_2p9 seq9;
+ seq_2p10 seq10;
+ seq_2p11 seq11;
+
+
+ `uvm_component_utils(read_text_mode)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase(phase);
+ seq1 = seq_2p1::type_id::create("seq1");
+ seq2 = seq_2p2::type_id::create("seq2");
+ seq3 = seq_2p3::type_id::create("seq3");
+ seq4 = seq_2p4::type_id::create("seq4");
+ seq5 = seq_2p5::type_id::create("seq5");
+ seq6 = seq_2p6::type_id::create("seq6");
+ seq7 = seq_2p7::type_id::create("seq7");
+ seq8 = seq_2p8::type_id::create("seq8");
+ seq9 = seq_2p9::type_id::create("seq9");
+ seq10 = seq_2p10::type_id::create("seq10");
+ seq11 = seq_2p11::type_id::create("seq11");
+ endfunction:build_phase
+
+ task run_phase (uvm_phase phase);
+ super.run_phase(phase);
+ phase.raise_objection(this);
+ seq1.start(env.agent._seq,null);
+ seq2.start(env.agent._seq,null);
+ seq3.start(env.agent._seq,null);
+ seq4.start(env.agent._seq,null);
+ seq5.start(env.agent._seq,null);
+ seq6.start(env.agent._seq,null);
+ seq7.start(env.agent._seq,null);
+ seq8.start(env.agent._seq,null);
+ seq9.start(env.agent._seq,null);
+ seq10.start(env.agent._seq,null);
+ seq11.start(env.agent._seq,null);
+ phase.drop_objection(this);
+ endtask:run_phase
+endclass:read_text_mode
+
+class nop_command_mode extends uart_base_test;
+
+ seq_3p1 seq1;
+ //seq_3p2 seq2;
+ seq_3p3 seq3;
+ seq_4p1 seq4;
+ //seq_4p2 seq5;
+ seq_4p3 seq6;
+
+ `uvm_component_utils(nop_command_mode)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase(phase);
+ seq1 = seq_3p1::type_id::create("seq1");
+ //seq2 = seq_3p2::type_id::create("seq2");
+ seq3 = seq_3p3::type_id::create("seq3");
+ seq4 = seq_4p1::type_id::create("seq4");
+ //seq5 = seq_4p2::type_id::create("seq5");
+ seq6 = seq_4p3::type_id::create("seq6");
+ endfunction:build_phase
+
+ task run_phase(uvm_phase phase);
+ super.run_phase(phase);
+ phase.raise_objection(this);
+ seq1.start(env.agent._seq,null);
+ //seq2.start(env.agent._seq,null);
+ seq3.start(env.agent._seq,null);
+ seq4.start(env.agent._seq,null);
+ //seq5.start(env.agent._seq,null);
+ seq6.start(env.agent._seq,null);
+ phase.drop_objection(this);
+ endtask:run_phase
+endclass:nop_command_mode
+
+class write_command_mode extends uart_base_test;
+
+ seq_5p1 seq1;
+ seq_5p2 seq2;
+ seq_5p3 seq3;
+ seq_5p4 seq4;
+ seq_5p5 seq5;
+ seq_5p6 seq6;
+ seq_5p7 seq7;
+ seq_5p8 seq8;
+ seq_5p9 seq9;
+ seq_5p10 seq10;
+
+ `uvm_component_utils(write_command_mode)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase(phase);
+ seq1 = seq_5p1::type_id::create("seq1");
+ seq2 = seq_5p2::type_id::create("seq2");
+ seq3 = seq_5p3::type_id::create("seq3");
+ seq4 = seq_5p4::type_id::create("seq4");
+ seq5 = seq_5p5::type_id::create("seq5");
+ seq6 = seq_5p6::type_id::create("seq6");
+ seq7 = seq_5p7::type_id::create("seq7");
+ seq8 = seq_5p8::type_id::create("seq8");
+ seq9 = seq_5p9::type_id::create("seq9");
+ seq10 = seq_5p10::type_id::create("seq10");
+ endfunction:build_phase
+
+ task run_phase (uvm_phase phase);
+ super.run_phase(phase);
+ phase.raise_objection(this);
+ uvm_test_done.set_drain_time(this,5000);
+ seq1.start(env.agent._seq,null);
+ seq2.start(env.agent._seq,null);
+ seq3.start(env.agent._seq,null);
+ seq4.start(env.agent._seq,null);
+ seq5.start(env.agent._seq,null);
+ seq6.start(env.agent._seq,null);
+ seq7.start(env.agent._seq,null);
+ seq8.start(env.agent._seq,null);
+ seq9.start(env.agent._seq,null);
+ seq10.start(env.agent._seq,null);
+ phase.drop_objection(this);
+ endtask:run_phase
+endclass: write_command_mode
+
+class read_command_mode extends uart_base_test;
+
+ seq_6p1 seq1;
+ seq_6p2 seq2;
+ seq_6p3 seq3;
+ seq_6p4 seq4;
+ seq_6p5 seq5;
+ seq_6p6 seq6;
+ seq_6p7 seq7;
+ seq_6p8 seq8;
+ seq_6p9 seq9;
+ seq_6p10 seq10;
+
+ `uvm_component_utils(read_command_mode)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ seq1 = seq_6p1::type_id::create("seq1");
+ seq2 = seq_6p2::type_id::create("seq2");
+ seq3 = seq_6p3::type_id::create("seq3");
+ seq4 = seq_6p4::type_id::create("seq4");
+ seq5 = seq_6p5::type_id::create("seq5");
+ seq6 = seq_6p6::type_id::create("seq6");
+ seq7 = seq_6p7::type_id::create("seq7");
+ seq8 = seq_6p8::type_id::create("seq8");
+ seq9 = seq_6p9::type_id::create("seq9");
+ seq10 = seq_6p10::type_id::create("seq10");
+ endfunction:new
+
+ function void build_phase (uvm_phase phase);
+ super.build_phase(phase);
+
+ endfunction:build_phase
+
+ task run_phase (uvm_phase phase);
+ super.run_phase(phase);
+ phase.raise_objection(this);
+ seq1.start(env.agent._seq,null);
+ seq2.start(env.agent._seq,null);
+ seq3.start(env.agent._seq,null);
+ seq4.start(env.agent._seq,null);
+ seq5.start(env.agent._seq,null);
+ seq6.start(env.agent._seq,null);
+ seq7.start(env.agent._seq,null);
+ seq8.start(env.agent._seq,null);
+ seq9.start(env.agent._seq,null);
+ seq10.start(env.agent._seq,null);
+ phase.drop_objection(this);
+ endtask:run_phase
+endclass:read_command_mode
\ No newline at end of file
trunk/tb/test/uart_test.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/draft
===================================================================
--- trunk/tb/draft (nonexistent)
+++ trunk/tb/draft (revision 2)
@@ -0,0 +1,14 @@
+view wave
+
+add wave \
+sim:/uart_top_tb/uart_inf/ser_in \
+sim:/uart_top_tb/uart_inf/ser_out \
+sim:/uart_top_tb/uart_inf/clock \
+sim:/uart_top_tb/uart_inf/start_trans \
+sim:/uart_top_tb/rf_inf/int_address \
+sim:/uart_top_tb/rf_inf/int_wr_data \
+sim:/uart_top_tb/rf_inf/int_write \
+sim:/uart_top_tb/rf_inf/int_rd_data \
+sim:/uart_top_tb/rf_inf/int_read \
+sim:/uart_top_tb/rf_inf/int_gnt \
+sim:/uart_top_tb/rf_inf/int_req
\ No newline at end of file
trunk/tb/draft
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/analysis/uart_scoreboard.svh
===================================================================
--- trunk/tb/analysis/uart_scoreboard.svh (nonexistent)
+++ trunk/tb/analysis/uart_scoreboard.svh (revision 2)
@@ -0,0 +1,164 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : ANALYSIS
+//-----------------------------------------------------------------------------
+// TITLE : UART ANALYSIS
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 22012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+class uart_scoreboard extends uvm_scoreboard;
+
+ uvm_tlm_analysis_fifo #(uart_transaction) mon_fifo;
+
+ uvm_analysis_export #(uart_transaction) scbd_mon;
+
+ uvm_tlm_analysis_fifo #(uart_transaction) drv_fifo;
+
+ uvm_analysis_export #(uart_transaction) scbd_drv;
+
+ uart_transaction frm_drv,frm_drv_tmp;
+
+ uart_transaction frm_mon,frm_mon_tmp;
+
+ `uvm_component_utils(uart_scoreboard)
+
+ function new (string name , uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ extern function void build_phase (uvm_phase phase);
+
+ extern function void connect_phase (uvm_phase phase);
+
+ extern task run_phase (uvm_phase phase);
+endclass:uart_scoreboard
+
+
+function void uart_scoreboard::build_phase (uvm_phase phase);
+ super.build_phase(phase);
+
+ frm_drv = uart_transaction::type_id::create("frm_drv");
+ frm_drv_tmp = uart_transaction::type_id::create("frm_drv_tmp");
+
+ frm_mon = uart_transaction::type_id::create("frm_mon");
+ frm_mon_tmp = uart_transaction::type_id::create("frm_mon_tmp");
+
+ mon_fifo = new ("mon_fifo",this);
+ scbd_mon = new ("scbd_mon",this);
+
+ drv_fifo = new ("drv_fifo",this);
+ scbd_drv = new ("scbd_drv",this);
+
+endfunction:build_phase
+
+function void uart_scoreboard::connect_phase (uvm_phase phase);
+ scbd_mon.connect(mon_fifo.analysis_export);
+ scbd_drv.connect(drv_fifo.analysis_export);
+endfunction:connect_phase
+
+task uart_scoreboard::run_phase (uvm_phase phase);
+ int iteration;
+ iteration = 0;
+ forever
+ begin
+ iteration++;
+ drv_fifo.get(frm_drv_tmp);
+ $cast(frm_drv,frm_drv_tmp.clone());
+ mon_fifo.get(frm_mon_tmp);
+ $cast(frm_mon,frm_mon_tmp.clone());
+
+ if (frm_drv._mode != frm_mon._mode)
+ begin
+ `uvm_fatal("Testbench Bug",$sformatf("Modes aren't similiar .. @time=%0t, It was requested to use %p mode and the applied mode is %p ",$time,frm_drv._mode,frm_mon._mode))
+ end
+ else
+ begin
+ case (frm_drv._mode)
+ text:
+ begin
+ if(frm_drv._command != frm_mon._command)
+ begin
+ `uvm_fatal("Testbench Bug",$sformatf("Commands aren't identical .. @time=%0t, It was requested to drive %p command and the applied command is %p ",$time,frm_drv._command,frm_mon._command))
+ end
+ else
+ begin
+ case(frm_drv._command)
+ read:
+ begin
+ if (frm_drv._data != frm_mon._data)
+ begin
+ `uvm_error("Failed Read Text Mode",$sformatf("Data fields aren't identical ,, @time=%0t It was requested to drive %p and dut reply with the data %p",$time,frm_drv._data,frm_mon._data))
+ end
+ else if((frm_drv._data == frm_mon._data) &&
+ (frm_drv.address == frm_mon.address) &&
+ (frm_drv._spacetype1 == frm_mon._spacetype1) &&
+ (frm_drv._eoltype == frm_mon._eoltype) &&
+ (frm_drv._chartype == frm_mon._chartype))
+ begin
+ `uvm_info("Passed Read Text Mode",$sformatf("Data fields are identical ,, @time=%0t It was requested to read from the address %h and dut reply with the data %p using white space = %p and %p prefix character and %p as end of line character",$time,frm_drv.address,frm_mon._data,frm_drv._spacetype1,frm_drv._chartype,
+ frm_drv._eoltype),UVM_NONE)
+ end
+ else
+ begin
+ `uvm_error("Failed Read Text Mode",$sformatf("@time=%0t .. It is Requested to request to read data = %p address of %h with character prefix : %p using white space = %p and end of line character %p .. and found data = %p and address=%h with character prefix : %p using white space = %p and end of line character %p",$time, frm_drv._data,frm_drv.address,frm_drv._chartype,frm_drv._spacetype1,frm_drv._eoltype,
+ frm_mon._data,frm_mon.address,frm_mon._chartype,frm_mon._spacetype1,frm_mon._eoltype))
+ end
+ end
+ write:
+ begin
+ if (frm_drv._data != frm_mon._data)
+ begin
+ `uvm_error("Failed Write Text Mode",$sformatf("Data fields aren't identical ,, @time=%0t It was requested to drive %p and dut register the data %p",$time,frm_drv._data,frm_mon._data))
+ end
+ else if((frm_drv._data == frm_mon._data) &&
+ (frm_drv.address == frm_mon.address) &&
+ (frm_drv._spacetype1 == frm_mon._spacetype1) &&
+ (frm_drv._eoltype == frm_mon._eoltype) &&
+ (frm_drv._chartype == frm_mon._chartype))
+ begin
+ `uvm_info("Passed write Text Mode",$sformatf("Data fields are identical ,, @time=%0t It was requested to write to the address %h and dut register the data %p using white space = %p and %p prefix character and %p as end of line character",$time,frm_drv.address,frm_mon._data,frm_drv._spacetype1,frm_drv._chartype,
+ frm_drv._eoltype),UVM_NONE)
+ end
+ else
+ begin
+ `uvm_error("Failed write Text Mode",$sformatf("@time=%0t .. It is Requested to request to write data = %p address of %h with character prefix : %p using white space = %p and end of line character %p .. and found data = %p and address=%h with character prefix : %p using white space = %p and end of line character %p",$time, frm_drv._data,frm_drv.address,frm_drv._chartype,frm_drv._spacetype1,frm_drv._eoltype,
+ frm_mon._data,frm_mon.address,frm_mon._chartype,frm_mon._spacetype1,frm_mon._eoltype))
+ end
+
+ end
+ default:
+ begin
+ `uvm_fatal("Testbench Bug",$sformatf("@time = %0t .. It isn't allowablt to drive %p command through text mode",$time,frm_drv._command))
+ end
+ endcase
+ end
+ end
+ binary:
+ begin
+
+ end
+ wrong_mode:
+ begin
+
+ end
+ default:
+ begin
+ `uvm_fatal("Testbench Bug",$sformatf("Mode is undefined = %p",frm_drv._mode))
+ end
+ endcase
+ end
+ end
+endtask:run_phase
\ No newline at end of file
trunk/tb/analysis/uart_scoreboard.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/interfaces/uart_interface.sv
===================================================================
--- trunk/tb/interfaces/uart_interface.sv (nonexistent)
+++ trunk/tb/interfaces/uart_interface.sv (revision 2)
@@ -0,0 +1,1307 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : BUS FUNCTIONAL MODEL
+//-----------------------------------------------------------------------------
+// TITLE : UART Interface
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 25122015 FILE CREATION
+// 2 HANY SALAH 07012016 ADD USER ROUTINE, TEXT MODE ROUTINES.
+// 3 HANY SALAH 21012016 REPLACE PUSH BYTE WITH PUSH FIELD
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+`include "defin_lib.svh"
+interface uart_interface (input bit clock, // Global Clock Signal
+ input bit reset); // Global Asynchronous Reset Signal
+
+//-----------------------------------------------
+//
+// BFM Parameter
+//
+//-----------------------------------------------
+
+ int act_edge; // 2: negative edge 1: positive edge
+ int start_bit; // 2: LSB first 1: MSB first
+ int num_stop_bits;// 2: two stop bits 1: one stop bits
+ int num_bits; // 7: seven bits data 8: eight bits data
+ int data_rep; // 2: binarry 1: ASCII
+ int parity; // 3: parity odd 2: parity even 1: parity off
+ time response_time;
+
+
+//-----------------------------------------------
+//
+// UART Signals
+//
+//-----------------------------------------------
+
+ logic ser_in; // Serial Data Input
+ logic ser_out; // Serial Data Ouptut
+ wire serial_out;
+
+//-----------------------------------------------
+//
+// USER Variables Declarations
+//
+//-----------------------------------------------
+
+ event start_trans;
+
+ assign serial_out = 1'bz;
+ assign serial_out = ser_out;
+
+//-----------------------------------------------
+//
+// USER Routines
+//
+//-----------------------------------------------
+
+ // Through This routine, the uart bfm is initialize its configuration parameters
+ // BFM should know through which edge it will either capture or force the data.
+ // Also should know whether the sent or received data will start with most sign-
+ // ificant bit or least significant bit.
+ function void set_configuration ( int _edge,
+ int first_bit,
+ int _numstopbits,
+ int _numbits,
+ int _datarep,
+ int _paritymode,
+ time _resp);
+ act_edge = _edge;
+ start_bit = first_bit;
+ num_stop_bits = _numstopbits;
+ num_bits = _numbits;
+ data_rep = _datarep;
+ parity = _paritymode;
+ response_time = _resp;
+ endfunction: set_configuration
+
+
+ // Through the following routine, the uart bfm make an event that some transact-
+ // -ion would be forced on UART signals
+ function void set_event ();
+ -> start_trans ;
+ endfunction:set_event
+
+
+ function void force_sout(bit x);
+ case (x)
+ 1'b1:
+ begin
+ //ser_out = `one;
+ ser_out = 1'b1;
+ end
+ 1'b0:
+ begin
+ //ser_out = `zero;
+ ser_out = 1'b0;
+ end
+ endcase
+ endfunction:force_sout
+
+ // Through this routine, the uart bfm push bit on the serial ouptut port ser_out
+ // based on the configured active edge field, UART will push bit on data. BFM
+ // will assign testbench error in case of un-configured active edge.
+ task push_bit_serout (input bit data);
+ case (act_edge)
+ `_negedge:
+ begin
+ @(negedge clock)
+ begin
+ force_sout(data);
+ end
+ end
+ `_posedge:
+ begin
+ @(posedge clock)
+ begin
+ force_sout(data);
+ end
+ end
+ default:
+ begin
+ $error("undefined active edge");
+ end
+ endcase
+ endtask:push_bit_serout
+
+ // Through this routine, the uart bfm push bit on the serial input port ser_in
+ // based on the configured active edge field, UART will push bit on data. BFM
+ // will assign testbench error in case of un-configured active edge.
+ /*task push_bit_serin (input bit data);
+ case (act_edge)
+ `_negedge:
+ begin
+ @(negedge clock)
+ begin
+ ser_in = data;
+ end
+ end
+ `_posedge:
+ begin
+ @(posedge clock)
+ begin
+ ser_in = data;
+ end
+ end
+ default:
+ begin
+ $error("undefined active edge");
+ end
+ endcase
+ endtask:push_bit_serin*/
+
+ // The following task will catch single bit from serial output port ser_out based
+ // on the configured active edge field, UART will capture data bit. BFM will
+ // assign testbench error in case of un-configured active edge.
+ task catch_bit_serout (output bit data);
+ case (act_edge)
+ `_negedge:
+ begin
+ @(negedge clock)
+ begin
+ #(`buad_clk_period/4) data = ser_out;
+ end
+ end
+ `_posedge:
+ begin
+ @(posedge clock)
+ begin
+ #(`buad_clk_period/4) data = ser_out;
+ end
+ end
+ default:
+ begin
+ $error("undefined active edge");
+ end
+ endcase
+ endtask:catch_bit_serout
+
+ // The following task will catch single bit from serial input port ser_in based
+ // on the configured active edge field, UART will capture data bit. BFM will
+ // assign testbench error in case of un-configured active edge.
+ task catch_bit_serin (output bit data);
+ case (act_edge)
+ `_negedge:
+ begin
+ @(negedge clock)
+ begin
+ #(`buad_clk_period/4) data = ser_in;
+ end
+ end
+ `_posedge:
+ begin
+ @(posedge clock)
+ begin
+ #(`buad_clk_period/4)data = ser_in;
+ end
+ end
+ default:
+ begin
+ $error("undefined active edge");
+ end
+ endcase
+ endtask:catch_bit_serin
+
+ // Through the following task, UART BFM will force data byte on serial output
+ // port based on the configured start_bit field. BFM will assign testbench err-
+ // or in case of un-configured start_bit field.
+ task push_field_serout (input byte data);
+ // start bit
+ push_bit_serout(1'b0);
+
+ // data fields
+ case (start_bit)
+ `lsb_first:
+ begin
+ for (int index=0;index<8;index++)
+ begin
+ push_bit_serout(data[index]);
+ end
+ end
+ `msb_first:
+ begin
+ for (int index=7;index>=0;index--)
+ begin
+ push_bit_serout(data[index]);
+ end
+ end
+ default:
+ begin
+ $error("Undefined serial mode");
+ end
+ endcase
+
+ // Stop bit(s)
+ repeat (num_stop_bits)
+ begin
+ push_bit_serout(1'b1);
+ end
+
+ endtask:push_field_serout
+
+ // Through the following task, UART BFM will force data byte on serial output
+ // port based on the configured start_bit field. BFM will assign testbench err-
+ // or in case of un-configured start_bit field.
+ /*task push_byte_serin (input byte data);
+ case (start_bit)
+ `lsb_first:
+ begin
+ for (int index=0;index<8;index++)
+ begin
+ push_bit_serin(data[index]);
+ end
+ end
+ `msb_first:
+ begin
+ for (int index=7;index>=0;index--)
+ begin
+ push_bit_serin(data[index]);
+ end
+ end
+ default:
+ begin
+ $error("Undefined serial mode");
+ end
+ endcase
+ endtask:push_byte_serin*/
+
+
+ // Through the following task, UART BFM will catpure data byte from serial out-
+ // put port based on the configured start_bit field. BFM will assign testbench
+ // error in case of un-configured start_bit field.
+ task catch_field_serout (output byte data);
+ bit end_bit;
+
+ // wait start bit
+ wait(ser_out == 1'b0);
+ case(start_bit)
+ `lsb_first:
+ begin
+ for (int index=0;index<8;index++)
+ begin
+ catch_bit_serout(data[index]);
+ end
+ end
+ `msb_first:
+ begin
+ for (int index=7;index>=0;index--)
+ begin
+ catch_bit_serout(data[index]);
+ end
+ end
+ default:
+ begin
+ $error("Undefined serial mode");
+ end
+ endcase
+ catch_bit_serout(end_bit);
+ if(end_bit != 1'b1)
+ begin
+ $error("at time =%0t ,, the first end bit = %0b",$time,end_bit);
+ $stop;
+ end
+ if (num_stop_bits == 2)
+ begin
+ catch_bit_serout(end_bit);
+ if(end_bit != 1'b1)
+ begin
+ $error("at time =%0t ,, the first end bit = %0b",$time,end_bit);
+ $stop;
+ end
+ end
+ endtask:catch_field_serout
+
+ // Through the following task, UART BFM will catpure data byte from serial out-
+ // put port based on the configured start_bit field. BFM will assign testbench
+ // error in case of un-configured start_bit field.
+ task catch_field_serin (output byte data);
+ bit end_bit;
+
+ // wait start bit
+
+ wait (ser_in == 1'b0);
+ #(`buad_clk_period/2);
+ case(start_bit)
+ `lsb_first:
+ begin
+ for (int index=0;index<8;index++)
+ begin
+ catch_bit_serin(data[index]);
+ end
+ end
+ `msb_first:
+ begin
+ for (int index=7;index>=0;index--)
+ begin
+ catch_bit_serin(data[index]);
+ end
+ end
+ default:
+ begin
+ $error("Undefined serial mode");
+ end
+ endcase
+ catch_bit_serin(end_bit);
+ if(end_bit != 1'b1)
+ begin
+ $error("at time =%0t ,, the first end bit = %0b",$time,end_bit);
+ $stop;
+ end
+ if (num_stop_bits == 2)
+ begin
+ catch_bit_serin(end_bit);
+ if(end_bit != 1'b1)
+ begin
+ $error("at time =%0t ,, the first end bit = %0b",$time,end_bit);
+ $stop;
+ end
+ end
+ endtask:catch_field_serin
+
+
+ // Through the following function, the byte is reversed in the manner that the
+ // byte is merrored
+ function byte reverse_byte (byte data);
+ byte tmp;
+ for (int index=0;index<8;index++)
+ begin
+ tmp[index] = data[7-index];
+ end
+ return tmp;
+ endfunction:reverse_byte
+
+//-----------------------------------------------
+//
+// UART Routines
+//
+//-----------------------------------------------
+
+ // Through the following method, UART BFM will initialize write request in UART
+ // text mode. This task is accomplished with known of either the request chara-
+ // cter is capital or small, and also the used white space type is either single
+ // space or tab, and finally the end of line mechanism.
+ task write_text_mode(input int alph,
+ input int scp_type1,
+ input byte space_wrong1,
+ input int scp_type2,
+ input byte space_wrong2,
+ input int eol,
+ input byte eol_wrong,
+ input bit [`size-1:0] address,
+ input byte data);
+ // Write procedures
+ // First Field
+ if (alph == `small_let)
+ begin
+ push_field_serout(`w);
+ end
+ else if (alph == `capital_let)
+ begin
+ push_field_serout(`W);
+ end
+ else
+ $error("Testbench error .. No capitar or small letter is choosed");
+
+ // Second Field
+ if (scp_type1 == `single_space)
+ begin
+ push_field_serout(`space);
+ end
+ else if (scp_type1 == `tab_space)
+ begin
+ push_field_serout(`tab);
+ end
+ else if (scp_type1 == `space_wrong)
+ begin
+ push_field_serout(space_wrong1);
+ end
+ else
+ $error("Testbench error .. No single space or multiple space is choosed");
+
+ // third field
+ case (data_rep)
+ `binary_rep:
+ begin
+ push_field_serout(data);
+ end
+ `ascii_rep:
+ begin
+ push_field_serout(bin_asci_conv(data[7:4]));
+ push_field_serout(bin_asci_conv(data[3:0]));
+ end
+ default:$error("undefined data representation");
+ endcase
+
+ // forth field
+ if (scp_type2 == `single_space)
+ begin
+ push_field_serout(`space);
+ end
+ else if (scp_type2 == `tab_space)
+ begin
+ push_field_serout(`tab);
+ end
+ else if (scp_type2 == `space_wrong)
+ begin
+ push_field_serout(space_wrong2);
+ end
+ else
+ $error("Testbench error .. No single or multiple space is choosed");
+ // fivth field
+ case (data_rep)
+ `binary_rep:
+ begin
+ push_field_serout(address[15:08]);
+ push_field_serout(address[07:00]);
+ end
+ `ascii_rep:
+ begin
+ push_field_serout(bin_asci_conv(address[15:12]));
+ push_field_serout(bin_asci_conv(address[11:08]));
+ push_field_serout(bin_asci_conv(address[07:04]));
+ push_field_serout(bin_asci_conv(address[03:00]));
+ end
+ default:$error("undefined data representation");
+ endcase
+
+ // sixth Field
+ if (eol == `cr_eol)
+ begin
+ push_field_serout(`CR);
+ end
+ else if (eol == `lf_eol)
+ begin
+ push_field_serout(`LF);
+ end
+ else if (eol == `eol_wrong)
+ begin
+ push_field_serout(eol_wrong);
+ end
+ else
+ $error("Testbench error .. either CR or LF isn't choosed as eol");
+ endtask:write_text_mode
+
+ // Through the following method, UART BFM will initialize read request in UART
+ // text mode and receive the response as defined in UART specification standard
+ // This task is accomplished with known of either the request character is cap-
+ // ital or small, and also the used white space type is either single space or
+ // tab, and finally the end of line mechanism. This methed includes two main se-
+ // ctions; the first one includes the four successive fields of defined read re-
+ // quest. And the another one includes the response.
+ task read_text_mode (input int alph,
+ input int scp_type,
+ input byte space_wrong,
+ input int eol,
+ input byte eol_wrong,
+ input bit [`size-1:0] address);
+ byte data;
+ byte temp;
+ byte char1,char2;
+ bit miss;
+ time prope1;
+ // Read Request
+ // First Field
+ if (alph == `small_let)
+ begin
+ push_field_serout(`r);
+ end
+ else if (alph == `capital_let)
+ begin
+ push_field_serout(`R);
+ end
+ else
+ $error("Testbench error .. No capitar or small letter is choosed");
+ // Second Field
+ if (scp_type == `single_space)
+ begin
+ push_field_serout(`space);
+ end
+ else if (scp_type == `tab_space)
+ begin
+ push_field_serout(`tab);
+ end
+ else if (scp_type == `space_wrong)
+ begin
+ push_field_serout(space_wrong);
+ end
+ else
+ $error("Testbench error .. No single or multiple white space is choosed");
+
+ // Third Field
+ case (data_rep)
+ `binary_rep:
+ begin
+ push_field_serout(address[15:08]);
+ push_field_serout(address[07:00]);
+ end
+ `ascii_rep:
+ begin
+ push_field_serout(bin_asci_conv(address[15:12]));
+ push_field_serout(bin_asci_conv(address[11:08]));
+ push_field_serout(bin_asci_conv(address[07:04]));
+ push_field_serout(bin_asci_conv(address[03:00]));
+ end
+ default:$error("undefined data representation");
+ endcase
+
+ // Forth Field
+ if (eol == `cr_eol)
+ begin
+ push_field_serout(`CR);
+ end
+ else if (eol == `lf_eol)
+ begin
+ push_field_serout(`LF);
+ end
+ else if (eol == `eol_wrong)
+ begin
+ push_field_serout(eol_wrong);
+ end
+ else
+ $error("Testbench error .. No CR or LF is choosed");
+
+ miss = 1'b0;
+ prope1 = $time;
+ fork
+ begin: miss_response_thread
+ while (($time-prope1)
trunk/tb/interfaces/uart_interface.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/interfaces/uart_arbiter.sv
===================================================================
--- trunk/tb/interfaces/uart_arbiter.sv (nonexistent)
+++ trunk/tb/interfaces/uart_arbiter.sv (revision 2)
@@ -0,0 +1,50 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : INTERFACE
+//-----------------------------------------------------------------------------
+// TITLE : UART Arbiter
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 29122015 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+interface uart_arbiter (input bit clock,
+ input bit reset);
+
+//--------------------------------
+//
+// Bus Control Signals
+//
+//--------------------------------
+
+ logic int_req; // Request Internal Bus Access
+ logic int_gnt; // Grant Internal Bus Access
+
+//--------------------------------
+//
+// Arbiter Control Signals
+//
+//--------------------------------
+
+ task accept_req ();
+ wait (int_req);
+ int_gnt = 1'b1;
+ endtask:accept_req
+
+ task declain_req ();
+ wait (int_req);
+ int_gnt = 1'b0;
+ endtask:declain_req
+
+endinterface:uart_arbiter
\ No newline at end of file
trunk/tb/interfaces/uart_arbiter.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/interfaces/rf_interface.sv
===================================================================
--- trunk/tb/interfaces/rf_interface.sv (nonexistent)
+++ trunk/tb/interfaces/rf_interface.sv (revision 2)
@@ -0,0 +1,167 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : INTERFACE
+//-----------------------------------------------------------------------------
+// TITLE : UART Interface
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 25122015 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+`include "defin_lib.svh"
+interface rf_interface (input bit clock, // Global Clock Signal
+ input bit reset); // Global Asynchronous Reset Signal
+
+
+
+//--------------------------------
+//
+// Register File Side Signals
+//
+//--------------------------------
+
+ logic [15:0] int_address; // Address Bus To Register File
+
+ logic [7:0] int_wr_data; // Write Data To Register File
+ logic int_write; // Write Contorl To Register File
+
+ logic [7:0] int_rd_data; // Read Data From Register File
+ logic int_read; // Read Control To Register File
+
+//--------------------------------
+//
+// CONTROL SIGNALS
+//
+//--------------------------------
+
+ logic int_gnt;
+ logic int_req;
+//--------------------------------
+//
+// Internal Variables
+//
+//--------------------------------
+
+ // Memory of 64K bytes as Register File
+ byte register_file [`mem_size-1:0];
+
+//--------------------------------
+//
+// Operation Blocks
+//
+//--------------------------------
+
+ always
+ begin
+ @(posedge clock or posedge reset);
+ begin
+ if (reset)
+ begin
+ reset_mem();
+ end
+ else if (int_write)
+ begin
+ fill_byte(int_address,int_wr_data);
+ end
+ else if (int_read)
+ begin
+ int_rd_data = read_mem_data(int_address);
+ end
+ end
+ end
+
+//--------------------------------
+//
+// Non Standard Routines
+//
+//--------------------------------
+
+ // fill_byte routine is a function that fill only single byte in the register
+ // file
+function void fill_byte (bit [`size-1:0] address,
+ byte data);
+
+ register_file[address] = data;
+endfunction:fill_byte
+
+ // fill_block routine is a function that fill continuous block of locations
+ // in the register file
+function automatic void fill_block(bit [`size-1:0] address,
+ ref byte data [],
+ int unsigned block_length);
+
+ for (int unsigned index = 0; index < block_length; index++)
+ begin
+ register_file[address+index] = data [index];
+ end
+endfunction:fill_block
+
+ // reset_mem routine is a function that fill reset the register file to contents
+ // zero
+ function void reset_mem();
+ for (int unsigned index = 0; index < `mem_size; index++)
+ begin
+ register_file[index] = 8'b0;
+ end
+endfunction:reset_mem
+
+ // read_mem_data routine is a function that load bus with the data content
+ function byte read_mem_data(bit [`size-1:0] address);
+ return register_file[address];
+ endfunction: read_mem_data
+
+ task automatic read_block(input int unsigned data_length,
+ input bit [15:0] address,
+ ref byte data []);
+ data = new [data_length];
+ for (int unsigned index=0;index
trunk/tb/interfaces/rf_interface.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/uart_pkg.sv
===================================================================
--- trunk/tb/uart_pkg.sv (nonexistent)
+++ trunk/tb/uart_pkg.sv (revision 2)
@@ -0,0 +1,33 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : TOP MODULE
+//-----------------------------------------------------------------------------
+// TITLE : UART Package
+// DESCRIPTION: This file
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 11012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+package uart_pkg;
+
+ import uvm_pkg::*;
+ import agent_pkg::*;
+ import env_pkg::*;
+
+ `include "uvm_macros.svh"
+
+ `include "uart_test.svh"
+
+
+endpackage:uart_pkg
\ No newline at end of file
trunk/tb/uart_pkg.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/uart_top.sv
===================================================================
--- trunk/tb/uart_top.sv (nonexistent)
+++ trunk/tb/uart_top.sv (revision 2)
@@ -0,0 +1,113 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : TOP MODULE
+//-----------------------------------------------------------------------------
+// TITLE : UART Top
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 11012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+ `include "defin_lib.svh"
+ `include "uart2bus_top.v"
+
+module uart_top_tb;
+
+ import uvm_pkg::*;
+ import uart_pkg::*;
+
+ `include "uvm_macros.svh"
+
+ logic clk_glob;
+
+ logic clk_uart;
+
+ logic reset;
+
+ assign rf_inf.int_req = arb_inf.int_req;
+ assign rf_inf.int_gnt = arb_inf.int_gnt;
+
+ uart_interface uart_inf (.reset(reset),
+ .clock(clk_uart));
+
+ rf_interface rf_inf (.reset(reset),
+ .clock(clk_glob));
+
+ uart_arbiter arb_inf (.reset (reset),
+ .clock(clk_glob));
+
+ uart2bus_top dut( .clock(clk_glob),
+ .reset(reset),
+ //.ser_in(serial_out),
+ .ser_in(uart_inf.ser_out),
+ .ser_out(uart_inf.ser_in),
+ .int_address(rf_inf.int_address),
+ .int_wr_data(rf_inf.int_wr_data),
+ .int_write(rf_inf.int_write),
+ .int_rd_data(rf_inf.int_rd_data),
+ .int_read(rf_inf.int_read),
+ .int_req(arb_inf.int_req),
+ //.int_gnt(arb_inf.int_gnt));
+ .int_gnt(1'b1));
+
+
+
+ initial
+ begin
+ reset = 1'b1;
+ clk_glob = 1'b0;
+ clk_uart = 1'b0;
+ #100;
+ reset = 1'b0;
+ end
+
+ initial
+ begin
+ fork
+ forever
+ begin
+ #(`glob_clk_period/2) clk_glob = ~clk_glob;
+ #((`glob_clk_period/2)+1) clk_glob = ~clk_glob;
+ end
+ forever
+ begin
+ #(`buad_clk_period/2) clk_uart = ~clk_uart;
+ #((`buad_clk_period/2)+1) clk_uart = ~clk_uart;
+ end
+ begin
+ #(500000000);
+ $error("Exceed the maximum limited time for simulation ..");
+ $finish;
+ end
+ join
+ end
+
+
+ initial
+ begin
+ uvm_config_db#(virtual uart_interface)::set(uvm_root::get(), "*", "uart_inf",uart_inf);
+
+ uvm_config_db#(virtual rf_interface)::set(uvm_root::get(), "*", "rf_inf",rf_inf);
+
+ uvm_config_db#(virtual uart_arbiter)::set(uvm_root::get(),"*","arb_inf",arb_inf);
+
+ run_test("write_text_mode");
+ //run_test("read_text_mode");
+ //run_test("nop_command_mode");
+ //run_test("read_command_mode");
+ //run_test("write_command_mode");
+ end
+
+
+endmodule:uart_top_tb
\ No newline at end of file
trunk/tb/uart_top.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/run.do
===================================================================
--- trunk/tb/run.do (nonexistent)
+++ trunk/tb/run.do (revision 2)
@@ -0,0 +1,63 @@
+vlib work
+#vlog -novopt ../../../uvm-1.2/src/uvm.sv +incdir+../../../uvm-1.2/src/
+vlog -novopt interfaces/uart_interface.sv +incdir+../
+vlog -novopt interfaces/rf_interface.sv +incdir+../
+vlog -novopt interfaces/uart_arbiter.sv +incdir+../
+#vlog -novopt agent/agent_pkg.sv +incdir+agent/
+
+
+#vlog -novopt agent/agent_pkg.sv +incdir+agent +incdir+agent/driver +incdir+./ +incdir+agent/configuration +incdir+agent/sequence +incdir+agent/transaction +incdir+../../../uvm-1.2/src/
+
+vlog -novopt agent/agent_pkg.sv +incdir+agent +incdir+agent/driver +incdir+./ +incdir+agent/configuration +incdir+agent/sequence +incdir+agent/transaction +incdir+agent/monitor
+
+vlog -novopt env/env_pkg.sv +incdir+env +incdir+analysis
+#vlog -novopt env/env_pkg.sv +incdir+env +incdir+../../../uvm-1.2/src/
+
+vlog -novopt uart_pkg.sv +incdir+test/ +incdir+agent/ +incdir+env/ +incdir+./ +incdir+../
+#vlog -novopt uart_pkg.sv +incdir+test/ +incdir+agent/ +incdir+env/ +incdir+../../../uvm-1.2/src/ +incdir+./
+
+
+
+vlog ../rtl/uart_tx.v +incdir+../rtl
+vlog ../rtl/uart_rx.v +incdir+../rtl
+vlog ../rtl/baud_gen.v +incdir+../rtl
+vlog ../rtl/uart_top.v +incdir+../rtl
+vlog ../rtl/uart_parser.v +incdir+../rtl
+vlog ../rtl/uart2bus_top.v +incdir+../rtl
+
+vlog -novopt uart_top.sv +incdir+../../rtl/i2c/ +incdir+./ +incdir+../rtl
+#vlog -novopt uart_top.sv +incdir+../../rtl/i2c/ +incdir+../../../uvm-1.2/src/
+
+vsim -novopt uart_top_tb
+view wave
+
+add wave \
+sim:/uart_top_tb/uart_inf/ser_in \
+sim:/uart_top_tb/uart_inf/ser_out \
+sim:/uart_top_tb/uart_inf/serial_out \
+sim:/uart_top_tb/serial_out \
+sim:/uart_top_tb/uart_inf/clock \
+sim:/uart_top_tb/uart_inf/start_trans \
+sim:/uart_top_tb/rf_inf/int_address \
+sim:/uart_top_tb/rf_inf/int_wr_data \
+sim:/uart_top_tb/rf_inf/int_write \
+sim:/uart_top_tb/rf_inf/int_rd_data \
+sim:/uart_top_tb/rf_inf/int_read \
+sim:/uart_top_tb/rf_inf/int_gnt \
+sim:/uart_top_tb/rf_inf/int_req \
+sim:/uart_top_tb/dut/int_gnt \
+sim:/uart_top_tb/dut/int_req \
+sim:/uart_top_tb/dut/ser_in \
+sim:/uart_top_tb/dut/ser_out \
+sim:/uart_top_tb/dut/reset \
+sim:/uart_top_tb/dut/clock
+run -all
+
+
+
+
+
+
+
+#vsim i2c_top +UVM_CONFIG_DB_TRACE
+#run -all
\ No newline at end of file
trunk/tb/run.do
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/env/env_pkg.sv
===================================================================
--- trunk/tb/env/env_pkg.sv (nonexistent)
+++ trunk/tb/env/env_pkg.sv (revision 2)
@@ -0,0 +1,34 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : ENVIRONEMNT
+//-----------------------------------------------------------------------------
+// TITLE : UART ENVIRONMENT PKG
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 10012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+package env_pkg;
+
+ import agent_pkg::*;
+ import uvm_pkg::*;
+
+ `include "uvm_macros.svh"
+
+
+ `include "uart_scoreboard.svh"
+ `include "uart_env.svh"
+
+endpackage:env_pkg
\ No newline at end of file
trunk/tb/env/env_pkg.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/env/uart_env.svh
===================================================================
--- trunk/tb/env/uart_env.svh (nonexistent)
+++ trunk/tb/env/uart_env.svh (revision 2)
@@ -0,0 +1,52 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : AGENT
+//-----------------------------------------------------------------------------
+// TITLE : UART ENVIRONMENT
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 10012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+class uart_env extends uvm_env;
+
+ uart_agent agent;
+
+ uart_scoreboard scbd;
+
+ `uvm_component_utils(uart_env)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ extern function void build_phase (uvm_phase phase);
+
+ extern function void connect_phase (uvm_phase phase);
+endclass:uart_env
+
+function void uart_env::build_phase (uvm_phase phase);
+ super.build_phase(phase);
+ agent = uart_agent::type_id::create("agent",this);
+ scbd = uart_scoreboard::type_id::create("uart_scoreboard",this);
+
+endfunction:build_phase
+
+function void uart_env::connect_phase (uvm_phase phase);
+ super.connect_phase(phase);
+
+ agent.drv_port.connect(scbd.scbd_drv);
+ agent.mon_port.connect(scbd.scbd_mon);
+
+endfunction:connect_phase
\ No newline at end of file
trunk/tb/env/uart_env.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/defin_lib.svh
===================================================================
--- trunk/tb/defin_lib.svh (nonexistent)
+++ trunk/tb/defin_lib.svh (revision 2)
@@ -0,0 +1,380 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : DEFINITION LIBRARY
+//-----------------------------------------------------------------------------
+// TITLE : UART Definition Library
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 25122015 FILE CREATION
+// 2 HANY SALAH 31122015 ADD DATA TYPE DEFINITIONS
+// 3 HANY SALAH 11012016 ADD TIMING PARAMETERS DEFINITION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+`timescale 1ns/1ns
+//------------------------------------------
+//
+// Definition Identifiers
+//
+//------------------------------------------
+
+ // Define size of address line
+ `define size 16
+
+ // 2 power size
+ `define mem_size 65536
+
+ // ASCII of 'r'
+ `define r 8'h72
+
+ // ASCII of 'R'
+ `define R 8'h52
+
+ // ASCII of 'w'
+ `define w 8'h77
+
+ // ASCII of 'W'
+ `define W 8'h57
+
+ // BINARY COMMAND PREFIX
+ `define bin_prfx 8'h0
+
+ // Single Space
+ `define space 8'h20
+
+ // Signel Tab
+ `define tab 8'h09
+
+ // LF
+ `define LF 8'h0A
+
+ // CR
+ `define CR 8'h0D
+
+ //UNIFIED ACK
+ `define ACK 8'h5A
+
+ // work on positive edge
+ `define _posedge 1
+
+ // work on negative edge
+ `define _negedge 2
+
+ // start with MSB
+ `define msb_first 1
+
+ // start with LSB
+ `define lsb_first 2
+
+ // Text Mode Command
+ `define text_mode 1
+
+ // Binary Mode Command
+ `define binary_mode 2
+
+ // Wrong Mode Command
+ `define wrong_mode 3
+
+ // Read Command
+ `define read_comm 1
+
+ // write Command
+ `define write_comm 2
+
+ // nop Command
+ `define nop_comm 3
+
+ // wrong Command
+ `define wrong_comm 4
+
+ // Use single white space
+ `define single_space 1
+
+ // Use multiple white space
+ `define tab_space 2
+
+ // Use wrong space character
+ `define space_wrong 3
+
+ // use cr as eol
+ `define cr_eol 1
+
+ // use lf as eol
+ `define lf_eol 2
+
+ // Use wrong eol
+ `define eol_wrong 3
+
+ // request either address increment or acknowledge
+ `define _yes 1
+
+ // don't request either address increment or acknowledge
+ `define _no 2
+
+ // Use capital Leter
+ `define capital_let 1
+
+ // Use small letter
+ `define small_let 2
+
+ // accept arbitration
+ `define accept 1
+
+ // declain arbitration
+ `define declain 2
+
+ // Binary represnetation
+ `define binary_rep 1
+
+ // ASCII Representation
+ `define ascii_rep 2
+
+ // NOP Control
+ `define nop_ctrl 2'b00
+
+ // Read Control
+ `define read_ctrl 2'b01
+
+ // Write Control
+ `define write_ctrl 2'b10
+//------------------------------------------
+//
+// Timing Defines
+//
+//------------------------------------------
+ // Define stability time
+ `define stab 10
+
+ // Define the period of global clock in terms of ns
+ `define glob_clk_period 25
+
+ // Define the period of baud clock in terms of ns
+ `define buad_clk_period 8680
+//------------------------------------------
+//
+// Configuration Data Type
+//
+//------------------------------------------
+
+// Represents the active edge
+typedef enum {pos_edge=1, // Based on positive edge
+ neg_edge=2} act_edge; // Based on negative edge
+
+// Represent the starting bit
+typedef enum {msb=1, // Most Significant bit first
+ lsb=2} start_bit; // Least Significant bit first
+
+//------------------------------------------
+//
+// New Data Type Definitions
+//
+//------------------------------------------
+
+ // Represents the mode of command to be one of the following options {text, command, wrong}. Wrong
+ // command mode is used to send a tricky fault command to test our DUT.
+ typedef enum {text=1, // Communicate using text mode
+ binary=2, // Communicate using command mode
+ wrong_mode=3} mode; // Communicate using wrong prefix
+
+ // Represents the type of the used white space to be one of the following options {single, tab, wrong}.
+ // Wrong type also is used to push tricky byte in the text mode.
+ typedef enum {single=1, // Using single space as a white space
+ tab=2, // Using tab as a white space
+ wrong_space=3} space_type; // Using wrong white space
+
+ // Represents the type of end of line used to be one of the following choices{cr, lf, wrong}.
+ // Wrong type is also used to push DUT in tricky manner.
+ typedef enum {cr=1, // Using CR as EOL
+ lf=2, // Using LF as EOL
+ wrong_eol=3} eol_type; // Using wrong EOL
+
+ // Represents the command either to be one of the following choices {read, write, NOP}
+ typedef enum {read=1, // Read Command
+ write=2, // Write Command
+ nop=3, // Make No Operation
+ invalid=4} command; // Invalid command value
+
+ // Represents both acknowledge and incremental address request{yes, no}
+ typedef enum {yes=1, // Request Acknowledge
+ no=2} req; // Request No Acknowledge
+
+ // Represents the type of prefix in text mode either to be {capital, small}.
+ typedef enum {cap=1, // Capital Letter
+ smal=2} char_type; // Small Letter
+
+ // Represents the internal bus state either {accept, refuse}
+ typedef enum {accept=1, // Accept Bus Grant
+ declain=2} arbit; // Refuse Bus Grant
+
+ // Define mode of data {ascii or binary}
+ typedef enum {bin=1,
+ ascii=2} data_mode;
+
+ // Define mode of the used parity
+ typedef enum {parity_off=1,
+ parity_even=2,
+ parity_odd=3} parity_mode ;
+
+//-------------------------------------------------------
+//
+// GLOBAL FUNCTION
+//
+//-------------------------------------------------------
+
+// Binary To ASCII Conversion to convert nibble into ASCII byte through the following look-up-table
+function byte bin_asci_conv (bit[3:0] data);
+ byte temp;
+ case (data)
+ 4'h0:
+ begin
+ temp = 8'h30;
+ end
+ 4'h1:
+ begin
+ temp = 8'h31;
+ end
+ 4'h2:
+ begin
+ temp = 8'h32;
+ end
+ 4'h3:
+ begin
+ temp = 8'h33;
+ end
+ 4'h4:
+ begin
+ temp = 8'h34;
+ end
+ 4'h5:
+ begin
+ temp = 8'h35;
+ end
+ 4'h6:
+ begin
+ temp = 8'h36;
+ end
+ 4'h7:
+ begin
+ temp = 8'h37;
+ end
+ 4'h8:
+ begin
+ temp = 8'h38;
+ end
+ 4'h9:
+ begin
+ temp = 8'h39;
+ end
+ 4'hA:
+ begin
+ temp = 8'h41;
+ end
+ 4'hB:
+ begin
+ temp = 8'h42;
+ end
+ 4'hC:
+ begin
+ temp = 8'h43;
+ end
+ 4'hD:
+ begin
+ temp = 8'h44;
+ end
+ 4'hE:
+ begin
+ temp = 8'h45;
+ end
+ 4'hF:
+ begin
+ temp = 8'h46;
+ end
+ endcase
+ return temp;
+endfunction:bin_asci_conv
+
+// ASCII To Binary Conversion is to convert ASCII byte into Binary nibble through the following Look-Up-Table
+function bit [3:0] asci_bin_conv (byte data);
+ bit [3:0] temp;
+ case (data)
+ 8'h30:
+ begin
+ temp = 4'h0;
+ end
+ 8'h31:
+ begin
+ temp = 4'h1;
+ end
+ 8'h32:
+ begin
+ temp = 4'h2;
+ end
+ 8'h33:
+ begin
+ temp = 4'h3;
+ end
+ 8'h34:
+ begin
+ temp = 4'h4;
+ end
+ 8'h35:
+ begin
+ temp = 4'h5;
+ end
+ 8'h36:
+ begin
+ temp = 4'h6;
+ end
+ 8'h37:
+ begin
+ temp = 4'h7;
+ end
+ 8'h38:
+ begin
+ temp = 4'h8;
+ end
+ 8'h39:
+ begin
+ temp = 4'h9;
+ end
+ 8'h41:
+ begin
+ temp = 4'hA;
+ end
+ 8'h42:
+ begin
+ temp = 4'hB;
+ end
+ 8'h43:
+ begin
+ temp = 4'hC;
+ end
+ 8'h44:
+ begin
+ temp = 4'hD;
+ end
+ 8'h45:
+ begin
+ temp = 4'hE;
+ end
+ 8'h46:
+ begin
+ temp = 4'hF;
+ end
+ default:
+ begin
+ $error("undefined ascii symbol");
+ end
+ endcase
+ return temp;
+endfunction:asci_bin_conv
\ No newline at end of file
trunk/tb/defin_lib.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/transaction/uart_transaction.svh
===================================================================
--- trunk/tb/agent/transaction/uart_transaction.svh (nonexistent)
+++ trunk/tb/agent/transaction/uart_transaction.svh (revision 2)
@@ -0,0 +1,116 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : TRANSACTION
+//-----------------------------------------------------------------------------
+// TITLE : UART Transaction
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 31122015 FILE CREATION
+// 2 HANY SALAH 01012016 COMPLETE ATTRIBUTES
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+class uart_transaction extends uvm_sequence_item;
+
+ // Represent the mode of operation either to be text or command mode
+ rand mode _mode;
+
+ // Represent the type of space either to be single space or tab
+ rand space_type _spacetype1,_spacetype2;
+
+ // Represent the wrong character used as a white space [Refer To Verification Plan For More Information]
+ rand byte space_wrong1;
+
+ // Represent the wrong character used as a white space [Refer To Verification Plan For More Information]
+ rand byte space_wrong2;
+
+ // Represent the used data through the stimulus
+ rand byte _data [];
+
+ // Represent the length of data used through the stimulus
+ rand int unsigned length_data;
+
+ // Represent the type of end of line used
+ rand eol_type _eoltype;
+
+ // Represent the wrong character used as an end of line [Refer To Verification Plan For More Information]
+ rand byte eol_wrong;
+
+ // Represent the used address through the stimulus
+ rand bit [15:0] address;
+
+ // Represent the type of command either read, write or no operation
+ rand command _command;
+
+ // Represent the acknowledge request
+ rand req _reqack;
+
+ // Represent the incremental address request
+ rand req _reqinc;
+
+ // Represent the character type of prefix in text mode command
+ rand char_type _chartype;
+
+ // Represent the internal bus state either free or busy
+ rand arbit _arbit;
+
+ // Represents random idle time
+ rand time time_before,time_after;
+
+ byte acknowledge;
+
+ int unsigned scale = 100;
+
+ `uvm_object_utils(uart_transaction)
+
+ function new (string name ="uart_transaction");
+ super.new(name);
+ endfunction: new
+
+ constraint data_length {
+ _data.size == length_data;
+ length_data <= 10;
+ time_before inside {200,300,400,500,600,700,800,900,1000};
+ time_after inside {200,300,400,500,600,700,800,900,1000};
+ }
+
+ extern function void do_copy (uvm_object rhs);
+endclass:uart_transaction
+
+
+function void uart_transaction::do_copy (uvm_object rhs);
+ uart_transaction _trans;
+ if (!$cast(_trans,rhs))
+ begin
+ `uvm_fatal("TYPE MISMATCH", "Type mismatch through do_copy method")
+ end
+ super.do_copy (_trans);
+ _mode =_trans._mode;
+ _spacetype1 =_trans._spacetype1;
+ _spacetype2 =_trans._spacetype2;
+ space_wrong1=_trans.space_wrong1;
+ space_wrong2=_trans.space_wrong2;
+ _data =_trans._data;
+ length_data =_trans.length_data;
+ _eoltype =_trans._eoltype;
+ eol_wrong =_trans.eol_wrong;
+ address =_trans.address;
+ _command =_trans._command;
+ _reqack =_trans._reqack;
+ _reqinc =_trans._reqinc;
+ _chartype =_trans._chartype;
+ _arbit =_trans._arbit;
+ time_before =_trans.time_before;
+ time_after =_trans.time_after;
+ acknowledge = _trans.acknowledge;
+endfunction:do_copy
\ No newline at end of file
trunk/tb/agent/transaction/uart_transaction.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/agent_pkg.sv
===================================================================
--- trunk/tb/agent/agent_pkg.sv (nonexistent)
+++ trunk/tb/agent/agent_pkg.sv (revision 2)
@@ -0,0 +1,38 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : AGENT
+//-----------------------------------------------------------------------------
+// TITLE : UART AGENT PKG
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 10012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+package agent_pkg;
+
+ `include "defin_lib.svh"
+
+ import uvm_pkg::*;
+ `include "uvm_macros.svh"
+
+ `include "uart_transaction.svh"
+ `include "uart_sequence.svh"
+ `include "uart_config.svh"
+ `include "uart_driver.svh"
+ `include "uart_monitor.svh"
+
+ `include "uart_agent.svh"
+
+endpackage:agent_pkg
\ No newline at end of file
trunk/tb/agent/agent_pkg.sv
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/configuration/uart_config.svh
===================================================================
--- trunk/tb/agent/configuration/uart_config.svh (nonexistent)
+++ trunk/tb/agent/configuration/uart_config.svh (revision 2)
@@ -0,0 +1,50 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : CONFIGURATION
+//-----------------------------------------------------------------------------
+// TITLE : UART Configuration
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 02012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+class uart_config extends uvm_object;
+
+ virtual uart_interface uart_inf;
+
+ virtual rf_interface rf_inf;
+
+ virtual uart_arbiter arb_inf;
+
+ act_edge _edge;
+
+ start_bit _start;
+
+ data_mode _datamode;
+
+ int num_stop_bits;
+
+ int num_of_bits;
+
+ parity_mode _paritymode;
+
+ time response_time;
+
+ `uvm_object_utils(uart_config)
+
+ function new (string name = "uart_config");
+ super.new(name);
+ endfunction:new
+endclass:uart_config
\ No newline at end of file
trunk/tb/agent/configuration/uart_config.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/monitor/uart_monitor.svh
===================================================================
--- trunk/tb/agent/monitor/uart_monitor.svh (nonexistent)
+++ trunk/tb/agent/monitor/uart_monitor.svh (revision 2)
@@ -0,0 +1,147 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : MONITOR
+//-----------------------------------------------------------------------------
+// TITLE : UART Monitor
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 12012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+class uart_monitor extends uvm_monitor;
+
+ uart_transaction trans;
+
+ uart_config _config;
+
+ virtual uart_interface uart_inf;
+
+ virtual rf_interface rf_inf;
+
+ uvm_analysis_port #(uart_transaction) mon_scbd;
+
+ `uvm_component_utils(uart_monitor)
+
+ function new (string name, uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+ function void display_content ();
+ $display("here %s\n command_type = %p \n command = %p \n char_type = %p \n space_type1 = %p \n space_wrong1 = %8b \n space_type2 = %p \n space_wrong2 = %8b \n eol_type = %p \n eol_wrong = %8b \n address = %h \n data = %8b", get_full_name(),trans._mode,
+ trans._command,
+ trans._chartype,
+ trans._spacetype1,
+ trans.space_wrong1,
+ trans._spacetype2,
+ trans.space_wrong2,
+ trans._eoltype,
+ trans.eol_wrong,
+ trans.address,
+ trans._data[0]);
+ endfunction:display_content
+
+ extern function void build_phase (uvm_phase phase);
+
+ extern function void connect_phase (uvm_phase phase);
+
+ extern function void end_of_elaboration_phase (uvm_phase phase);
+
+ extern task run_phase (uvm_phase phase);
+
+endclass:uart_monitor
+
+function void uart_monitor::build_phase (uvm_phase phase);
+ super.build_phase(phase);
+
+ _config = uart_config::type_id::create("_config",this);
+
+ trans = uart_transaction::type_id::create("trans");
+
+ mon_scbd = new ("mon_scbd",this);
+endfunction:build_phase
+
+function void uart_monitor::connect_phase (uvm_phase phase);
+
+endfunction:connect_phase
+
+function void uart_monitor::end_of_elaboration_phase(uvm_phase phase);
+ if (!uvm_config_db#(uart_config)::get(this,"","UART_CONFIGURATION",_config))
+ `uvm_fatal("NOCONFIGURATION",{"configuration instance must be set for",get_full_name(),"._config"})
+
+ if (!uvm_config_db#(virtual uart_interface)::get(this,"","uart_inf",_config.uart_inf))
+ `uvm_fatal("NOINF",{"UART Interface instance must be set for",get_full_name,".uart_inf"})
+ uart_inf = _config.uart_inf;
+
+ if(!uvm_config_db#(virtual rf_interface)::get(this,"","rf_inf",_config.rf_inf))
+ `uvm_fatal("NOINF",{"RF Interface instance must be set for",get_full_name(),".rf_inf"})
+ rf_inf = _config.rf_inf;
+
+endfunction:end_of_elaboration_phase
+
+task uart_monitor::run_phase (uvm_phase phase);
+ int iteration;
+ int command_type;
+ int _command;
+ int _chartype;
+ int _spacetype1;
+ int _spacetype2;
+ int _eoltype;
+ int _reqack;
+ int _reqinc;
+ iteration = 0;
+ forever
+ begin
+ iteration++;
+ uart_inf.wait_event();
+ uart_inf.capture_command(command_type,
+ _command,
+ _chartype,
+ _spacetype1,
+ trans.space_wrong1,
+ _spacetype2,
+ trans.space_wrong2,
+ _eoltype,
+ trans.eol_wrong,
+ trans.address,
+ trans._data,
+ trans.acknowledge,
+ trans.length_data,
+ _reqack,
+ _reqinc);
+ trans._mode = mode'(command_type);
+ trans._command = command'(_command);
+ trans._chartype = char_type'(_chartype);
+ trans._spacetype1 = space_type'(_spacetype1);
+ trans._spacetype2 = space_type'(_spacetype2);
+ trans._eoltype = eol_type '(_eoltype);
+ trans._reqinc = req '(_reqinc);
+ trans._reqack = req '(_reqack);
+ if (trans._command == write)
+ begin
+ if (trans._mode == text)
+ begin
+ trans._data[0] = rf_inf.read_mem_data(trans.address[7:0]);
+ end
+ else if (trans._mode == binary)
+ begin
+ rf_inf.read_block(trans.data_length,
+ trans.address,
+ trans._data);
+ end
+ end
+ //display_content();
+ mon_scbd.write(trans);
+ end
+
+endtask:run_phase
trunk/tb/agent/monitor/uart_monitor.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/sequence/uart_sequence.svh
===================================================================
--- trunk/tb/agent/sequence/uart_sequence.svh (nonexistent)
+++ trunk/tb/agent/sequence/uart_sequence.svh (revision 2)
@@ -0,0 +1,1338 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : SEQUENCE
+//-----------------------------------------------------------------------------
+// TITLE : UART Sequence
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 01012016 FILE CREATION
+// 2 HANY SALAH 02012016 ADD REST OF TESTS
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+
+// Base Sequence Class that hold the common attributes to all sequences
+class uart_base_sequence extends uvm_sequence #(uart_transaction);
+
+ uart_transaction trans;
+
+ `uvm_object_utils(uart_base_sequence)
+
+ function new (string name = "uart_base_sequence");
+ super.new(name);
+ trans = uart_transaction::type_id::create("trans");
+ endfunction:new
+endclass:uart_base_sequence
+
+//-------------------------------------------------------
+//
+// WRITE IN TEXT MODE
+//
+//-------------------------------------------------------
+
+ // 1.1 Apply UART write request using capital W
+ class seq_1p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p1)
+
+ function new (string name = "seq_1p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ _chartype == cap;
+ };
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p1
+
+
+ // 1.2 Apply UART write request using small w
+ class seq_1p2 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p2)
+
+ function new (string name = "seq_1p2");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ _chartype == smal;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p2
+
+
+ // 1.3 Apply UART write request using single space only
+ class seq_1p3 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p3)
+
+ function new (string name = "seq_1p3");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == single;
+ _spacetype2 == single;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p3
+
+
+ // 1.4 Apply UART write request using tab only.
+ class seq_1p4 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p4)
+
+ function new (string name = "seq_1p4");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == tab;
+ _spacetype2 == tab;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p4
+
+
+ // 1.5 Apply UART write request using both single space and tab.
+ class seq_1p5 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p5)
+
+ function new (string name = "seq_1p5");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ _spacetype2 != _spacetype1;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p5
+
+
+ // 1.6 Apply UART write request using one wrong space.
+ class seq_1p6 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p6)
+
+ function new (string name = "seq_1p6");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ (_spacetype1 == wrong_space) -> (_spacetype2 inside {tab, single});
+ (_spacetype1 != wrong_space) -> (_spacetype2 == wrong_space);
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ };
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p6
+
+
+ // 1.7 Apply UART write request using two wrong spaces
+ class seq_1p7 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p7)
+
+ function new (string name = "seq_1p7");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == wrong_space;
+ _spacetype2 == wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _reqinc == no;
+ _arbit == accept;
+ };
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p7
+
+
+ // 1.8 Apply UART write request to address 0
+ class seq_1p8 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p8)
+
+ function new (string name = "seq_1p8");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ address == 16'b0;
+ _reqinc == no;
+ _arbit == accept;
+ };
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p8
+
+
+ // 1.9 Apply UART write request to full range address
+ class seq_1p9 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p9)
+
+ function new (string name = "seq_1p9");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ address == 4'hFFFF;
+ _reqinc == no;
+ _arbit == accept;
+ };
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p9
+
+
+ // 1.10 Apply UART write request with data equal 0.
+ class seq_1p10 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p10)
+
+ function new (string name = "seq_1p10");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _data [0] == 8'b0;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p10
+
+
+ // 1.11 Apply UART write request with full range data.
+ class seq_1p11 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_1p11)
+
+ function new (string name = "seq_1p11");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == write;
+ _data [0] == 2'hff;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_1p11
+
+
+//-------------------------------------------------------
+//
+// READ IN TEXT MODE
+//
+//-------------------------------------------------------
+
+ // 2.1 Apply UART read request using capital R
+ class seq_2p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p1)
+
+ function new (string name = "seq_2p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ _chartype == cap;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p1
+
+
+ // 2.2 Apply UART read request using small r
+ class seq_2p2 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p2)
+
+ function new (string name = "seq_2p2");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ _chartype == smal;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p2
+
+
+ // 2.3 Apply UART read request using single space only
+ class seq_2p3 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p3)
+
+ function new (string name = "seq_2p3");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == single;
+ _spacetype2 == single;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p3
+
+
+ // 2.4 Apply UART read request using tab only.
+ class seq_2p4 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p4)
+
+ function new (string name = "seq_2p4");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == tab;
+ _spacetype2 == tab;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p4
+
+
+ // 2.5 Apply UART read request using both single space and tab.
+ class seq_2p5 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p5)
+
+ function new (string name = "seq_2p5");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ _spacetype2 != _spacetype1;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p5
+
+
+ // 2.6 Apply UART read request using one wrong space.
+ class seq_2p6 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p6)
+
+ function new (string name = "seq_2p6");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ (_spacetype1 == wrong_space) -> (_spacetype2 inside {tab, single});
+ (_spacetype1 != wrong_space) -> (_spacetype2 == wrong_space);
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p6
+
+
+ // 2.7 Apply UART read request using two wrong spaces
+ class seq_2p7 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p7)
+
+ function new (string name = "seq_2p7");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 == wrong_space;
+ _spacetype2 == wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p7
+
+
+ // 2.8 Apply UART read request to address 0
+ class seq_2p8 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p8)
+
+ function new (string name = "seq_2p8");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ address == 16'b0;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p8
+
+
+ // 2.9 Apply UART read request to full range address
+ class seq_2p9 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p9)
+
+ function new (string name = "seq_2p9");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ address == 4'hFFFF;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p9
+
+
+ // 2.10 Apply UART read request with data equal 0.
+ class seq_2p10 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p10)
+
+ function new (string name = "seq_2p10");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _data [0] == 8'b0;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p10
+
+
+ // 2.11 Apply UART read request with full range data.
+ class seq_2p11 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_2p11)
+
+ function new (string name = "seq_2p11");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == text;
+ _spacetype1 != wrong_space;
+ _spacetype2 != wrong_space;
+ length_data == 1;
+ _eoltype != wrong_eol;
+ _command == read;
+ _data [0] == 2'hff;
+ _reqinc == no;
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_2p11
+
+//-------------------------------------------------------
+//
+// NOP IN COMMAND MODE
+//
+//-------------------------------------------------------
+
+ // 3.1 Apply UART NOP command with acknowledge request and right command
+ // mode prefix
+ class seq_3p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_3p1)
+
+ function new (string name = "seq_3p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == nop;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_3p1
+
+ // 3.2 Apply UART NOP command with acknowledge request and wrong command
+ // mode prefix
+ class seq_3p2 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_3p2)
+
+ function new (string name = "seq_3p2");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == wrong_mode;
+ _command == nop;
+ address[15:7] != 2'h00;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_3p2
+
+ // 3.3 Apply several UART NOP command to different locations with different
+ // data lengths
+ class seq_3p3 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_3p3)
+
+ function new (string name = "seq_3p3");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == nop;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == yes;
+ } ;
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_3p3
+
+ // 4.1 Apply UART NOP command with non-acknowledge request and right command
+ // mode prefix
+ class seq_4p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_4p1)
+
+ function new (string name = "seq_4p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == nop;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_4p1
+
+ // 4.2 Apply UART NOP command with non-acknowledge request and wrong command
+ // mode prefix
+ class seq_4p2 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_4p2)
+
+ function new (string name = "seq_4p2");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == wrong_mode;
+ _command == nop;
+ address[15:7] != 2'h00;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_4p2
+
+ // 4.3 Apply several UART NOP command to different locations with different
+ // data lengths and non-acknowledge request
+ class seq_4p3 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_4p3)
+
+ function new (string name = "seq_4p3");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == nop;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == no;
+ } ;
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_4p3
+
+//-------------------------------------------------------
+//
+// WRITE IN COMMAND MODE
+//
+//-------------------------------------------------------
+
+ // 5.1 Apply UART write command with wrong prefix.
+ class seq_5p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p1)
+
+ function new (string name="seq_5p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == wrong_mode;
+ _command == write;
+ address[15:7] != 2'h00;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p1
+
+ // 5.2 Apply UART write commands to different addresses.
+ class seq_5p2 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_5p2)
+
+ function new (string name="seq_5p2");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ };
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p2
+
+ // 5.3 Apply UART write commands with several data lengths
+ class seq_5p3 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_5p3)
+
+ function new (string name="seq_5p3");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p3
+
+ // 5.4 Apply UART write command to address 0 with random data.
+ class seq_5p4 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p4)
+
+ function new (string name="seq_5p4");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ address == 16'b0;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p4
+
+ // 5.5 Apply UART write command to address 0xFFFF with random data.
+ class seq_5p5 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p5)
+
+ function new (string name="seq_5p5");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ address == 4'hffff;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p5
+
+ // 5.6 Apply UART write command with acknowledge request.
+ class seq_5p6 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p6)
+
+ function new (string name="seq_5p6");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p6
+
+ // 5.7 Apply UART write command with non-acknowledge request.
+ class seq_5p7 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p7)
+
+ function new (string name="seq_5p7");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p7
+
+ // 5.8 Apply UART write command including single byte.
+ class seq_5p8 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p8)
+
+ function new (string name="seq_5p8");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ length_data == 1;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p8
+
+ // 5.9 Apply UART write command including non-incremental address bit.
+ class seq_5p9 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p9)
+
+ function new (string name="seq_5p9");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqinc == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p9
+
+ // 5.10 Apply UART write command including incremental address bit.
+ class seq_5p10 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_5p10)
+
+ function new (string name="seq_5p10");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == write;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqinc == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_5p10
+
+
+//-------------------------------------------------------
+//
+// READ IN COMMAND MODE
+//
+//-------------------------------------------------------
+
+ // 6.1 Apply UART read command with wrong prefix.
+ class seq_6p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p1)
+
+ function new (string name="seq_6p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == wrong_mode;
+ _command == read;
+ address[15:7] != 2'h00;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p1
+
+ // 6.2 Apply UART read commands to different addresses.
+ class seq_6p2 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_6p2)
+
+ function new (string name="seq_6p2");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p2
+
+ // 6.3 Apply UART read commands with several data lengths
+ class seq_6p3 extends uart_base_sequence;
+
+ rand int unsigned num_of_comands;
+
+ `uvm_object_utils(seq_6p3)
+
+ function new (string name="seq_6p3");
+ super.new(name);
+ endfunction:new
+
+ constraint num_iter {
+ num_of_comands inside {[1:5]};
+ }
+
+ virtual task body ();
+ randomize();
+ start_item(trans);
+ repeat (num_of_comands)
+ begin
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ end
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p3
+
+ // 6.4 Apply UART read command to address 0 with random data.
+ class seq_6p4 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p4)
+
+ function new (string name="seq_6p4");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ address == 16'b0;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p4
+
+ // 6.5 Apply UART read command to address 0xFFFF with random data.
+ class seq_6p5 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p5)
+
+ function new (string name="seq_6p5");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ address == 4'hffff;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p5
+
+ // 6.6 Apply UART read command with acknowledge request.
+ class seq_6p6 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p6)
+
+ function new (string name="seq_6p6");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p6
+
+ // 6.7 Apply UART read command with non-acknowledge request.
+ class seq_6p7 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p7)
+
+ function new (string name="seq_6p7");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqack == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p7
+
+ // 6.8 Apply UART read command including single byte.
+ class seq_6p8 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p8)
+
+ function new (string name="seq_6p8");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ length_data == 1;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p8
+
+ // 6.9 Apply UART read command including non-incremental address bit.
+ class seq_6p9 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p9)
+
+ function new (string name="seq_6p9");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqinc == no;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p9
+
+ // 6.10 Apply UART read command including incremental address bit.
+ class seq_6p10 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_6p10)
+
+ function new (string name="seq_6p10");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command == read;
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqinc == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_6p10
+
+//-------------------------------------------------------
+//
+// INTERNAL BUS
+//
+//-------------------------------------------------------
+
+ // 7.1 Apply UART read or write commands and give the UART the bus grant.
+ class seq_7p1 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_7p1)
+
+ function new (string name="seq_7p1");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command inside {write,read};
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == accept;
+ _reqinc == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_7p1
+
+ // 7.2 Apply UART read or write commands and give no agreement to access internal bus
+ class seq_7p2 extends uart_base_sequence;
+
+ `uvm_object_utils(seq_7p2)
+
+ function new (string name="seq_7p2");
+ super.new(name);
+ endfunction:new
+
+ virtual task body ();
+ start_item(trans);
+ trans.randomize() with {
+ _mode == binary;
+ _command inside {write,read};
+ (length_data > 1) -> (_reqinc == yes);
+ _arbit == declain;
+ _reqinc == yes;
+ } ;
+ finish_item(trans);
+ endtask:body
+ endclass:seq_7p2
\ No newline at end of file
trunk/tb/agent/sequence/uart_sequence.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/uart_agent.svh
===================================================================
--- trunk/tb/agent/uart_agent.svh (nonexistent)
+++ trunk/tb/agent/uart_agent.svh (revision 2)
@@ -0,0 +1,64 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : AGENT
+//-----------------------------------------------------------------------------
+// TITLE : UART AGENT
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 10012016 FILE CREATION
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+class uart_agent extends uvm_agent;
+
+ uart_driver _drv;
+
+ uvm_sequencer#(uart_transaction) _seq;
+
+ uart_monitor _mon;
+
+ uvm_analysis_port #(uart_transaction) drv_port;
+
+ uvm_analysis_port #(uart_transaction) mon_port;
+
+ `uvm_component_utils(uart_agent)
+
+ function new (string name,uvm_component parent);
+ super.new(name,parent);
+ endfunction:new
+
+
+ extern function void build_phase (uvm_phase phase);
+
+ extern function void connect_phase (uvm_phase phase);
+endclass:uart_agent
+
+function void uart_agent::build_phase (uvm_phase phase);
+ super.build_phase(phase);
+ _drv = uart_driver::type_id::create("_drv",this);
+ _seq = uvm_sequencer#(uart_transaction)::type_id::create("_seq",this);
+ _mon = uart_monitor::type_id::create("_mon",this);
+
+ drv_port = new ("drv_port",this);
+ mon_port = new ("mon_port",this);
+endfunction:build_phase
+
+function void uart_agent::connect_phase (uvm_phase phase);
+ super.connect_phase(phase);
+ _drv.seq_item_port.connect(_seq.seq_item_export);
+
+ _drv.drv_scbd_cov.connect(drv_port);
+
+ _mon.mon_scbd.connect(mon_port);
+endfunction:connect_phase
\ No newline at end of file
trunk/tb/agent/uart_agent.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/tb/agent/driver/uart_driver.svh
===================================================================
--- trunk/tb/agent/driver/uart_driver.svh (nonexistent)
+++ trunk/tb/agent/driver/uart_driver.svh (revision 2)
@@ -0,0 +1,268 @@
+//-----------------------------------------------------------------------------
+//
+// UART2BUS VERIFICATION
+//
+//-----------------------------------------------------------------------------
+// CREATOR : HANY SALAH
+// PROJECT : UART2BUS UVM TEST BENCH
+// UNIT : DRIVER
+//-----------------------------------------------------------------------------
+// TITLE : UART Driver
+// DESCRIPTION: This
+//-----------------------------------------------------------------------------
+// LOG DETAILS
+//-------------
+// VERSION NAME DATE DESCRIPTION
+// 1 HANY SALAH 02012016 FILE CREATION
+// 2 HANY SALAH 07012016 ADD INITIALIZE BFM METHOD
+//-----------------------------------------------------------------------------
+// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR
+// OPENCORES MEMBERS ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE
+// CREATOR'S PERMISSION
+//-----------------------------------------------------------------------------
+
+class uart_driver extends uvm_driver #(uart_transaction);
+
+ // Two Transaction Instances that are used to bring and clone the
+ // stimulus
+ uart_transaction trans,_trans;
+
+ // Instance from Global UART Configuration
+ uart_config _config;
+
+ // UART Interafce instance
+ virtual uart_interface uart_inf;
+
+ // RF Interface instance
+ virtual rf_interface rf_inf;
+
+ // Arbiter Interface Instance
+ virtual uart_arbiter arb_inf;
+
+ uvm_analysis_port #(uart_transaction) drv_scbd_cov;
+
+ `uvm_component_utils(uart_driver)
+
+ function new (string name , uvm_component parent);
+ super.new(name,parent);
+ endfunction: new
+
+ function void display_content ();
+ $display("here %s\n command_type = %p \n command = %p \n char_type = %p \n space_type1 = %p \n space_wrong1 = %8b \n space_type2 = %p \n space_wrong2 = %8b \n eol_type = %p \n eol_wrong = %8b \n address = %h \n data = %8b", get_full_name(),trans._mode,
+ trans._command,
+ trans._chartype,
+ trans._spacetype1,
+ trans.space_wrong1,
+ trans._spacetype2,
+ trans.space_wrong2,
+ trans._eoltype,
+ trans.eol_wrong,
+ trans.address,
+ trans._data[0]);
+ endfunction:display_content
+
+ // UVM Build Phase Declaration that includes locating instances and get
+ // interfaces handler from the configuration database
+ extern function void build_phase (uvm_phase phase);
+
+ extern function void end_of_elaboration_phase (uvm_phase phase);
+
+ // UVM Run Phase Declaratio
+ extern task run_phase (uvm_phase phase);
+
+ // Actual drive data routine
+ extern task drive_data (int iteration);
+
+ // initialize bfms
+ extern function void initialize_bfms (act_edge _edge,
+ start_bit _bit,
+ int num_stop_bits,
+ int num_of_bits,
+ data_mode _datamode,
+ parity_mode _paritymode,
+ time _resp);
+endclass:uart_driver
+
+function void uart_driver::build_phase (uvm_phase phase);
+ super.build_phase(phase);
+
+ trans = uart_transaction::type_id::create("trans");
+ _trans = uart_transaction::type_id::create("_trans");
+
+ _config = uart_config::type_id::create("_config");
+
+ drv_scbd_cov = new("drv_scbd_cov",this);
+
+endfunction:build_phase
+
+function void uart_driver::end_of_elaboration_phase (uvm_phase phase);
+
+ if(!uvm_config_db#(uart_config)::get(this, "", "UART_CONFIGURATION", _config))
+ `uvm_fatal("NOCONFIGURATION",{"configuration instance must be set for: ",get_full_name(),"._config"});
+
+ if(!uvm_config_db#(virtual uart_interface)::get(this, "", "uart_inf", _config.uart_inf))
+ `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".uart_inf"});
+ uart_inf=_config.uart_inf;
+
+ if(!uvm_config_db#(virtual rf_interface)::get(this, "", "rf_inf", _config.rf_inf))
+ `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".rf_inf"});
+ rf_inf=_config.rf_inf;
+
+ if(!uvm_config_db#(virtual uart_arbiter)::get(this,"","arb_inf",_config.arb_inf))
+ `uvm_fatal("NOVIF",{"virtual interface must be set for:",get_full_name(),".arb_inf"})
+ arb_inf=_config.arb_inf;
+
+endfunction:end_of_elaboration_phase
+
+function void uart_driver::initialize_bfms (act_edge _edge,
+ start_bit _bit,
+ int num_stop_bits,
+ int num_of_bits,
+ data_mode _datamode,
+ parity_mode _paritymode,
+ time _resp);
+ uart_inf.set_configuration(_edge,_bit,num_stop_bits,num_of_bits,_datamode,_paritymode,_resp);
+endfunction:initialize_bfms
+
+task uart_driver::run_phase (uvm_phase phase);
+
+ int iteration;
+ iteration = 0;
+
+ initialize_bfms(_config._edge,
+ _config._start,
+ _config.num_stop_bits,
+ _config.num_of_bits,
+ _config._datamode,
+ _config._paritymode,
+ _config.response_time);
+
+ forever
+ begin
+ iteration++;
+ if (iteration == 3)
+ begin
+ //$stop;
+ end
+ seq_item_port.get_next_item(_trans);
+ $cast(trans,_trans.clone());
+ drv_scbd_cov.write(trans);
+ //display_content();
+ drive_data(iteration);
+ seq_item_port.item_done();
+ end
+endtask:run_phase
+
+task uart_driver::drive_data(int iteration);
+ uart_inf.wait_idle_time(trans.time_before*trans.scale);
+ uart_inf.set_event();
+ case (trans._mode)
+ text:
+ begin
+ case(trans._command)
+ read:
+ begin
+ fork
+ begin
+ if (trans._arbit == accept)
+ begin
+ arb_inf.accept_req();
+ end
+ else
+ begin
+ arb_inf.declain_req();
+ end
+ end
+ join_none
+ rf_inf.fill_byte (trans.address,
+ trans._data[0]);
+ uart_inf.read_text_mode(trans._chartype,
+ trans._spacetype1,
+ trans.space_wrong1,
+ trans._eoltype,
+ trans.eol_wrong,
+ trans.address);
+ end
+ write:
+ begin
+ fork
+ begin
+ if (trans._arbit == accept)
+ begin
+ arb_inf.accept_req();
+ end
+ else
+ begin
+ arb_inf.declain_req();
+ end
+ end
+ join_none
+ uart_inf.write_text_mode(trans._chartype,
+ trans._spacetype1,
+ trans.space_wrong1,
+ trans._spacetype2,
+ trans.space_wrong2,
+ trans._eoltype,
+ trans.eol_wrong,
+ trans.address,
+ trans._data[0]);
+ end
+ nop:
+ begin
+ `uvm_fatal("UNEXPECTED VALUE","NOP command value shouldn't be valued in text mode")
+ end
+ default:
+ begin
+ `uvm_fatal("wrong output", "wrong_mode")
+ end
+ endcase
+ end
+ binary:
+ begin
+ case(trans._command)
+ read:
+ begin
+ rf_inf.fill_block(trans.address,
+ trans._data,
+ trans.length_data);
+ uart_inf.read_binary_mode(trans._reqack,
+ trans._reqinc,
+ trans.length_data,
+ trans.address,
+ trans._data);
+ end
+ write:
+ begin
+ uart_inf.write_binary_mode(trans._reqack,
+ trans._reqinc,
+ trans.length_data,
+ trans.address,
+ trans._data);
+ end
+ nop:
+ begin
+ uart_inf.nop_command(trans._reqack,
+ trans._reqinc);
+ end
+ default:
+ begin
+ `uvm_fatal("UNDEFINED COMMAND","Binary command should be either read or write or no operation")
+ end
+ endcase
+ end
+ wrong_mode:
+ begin
+ uart_inf.wrong_command(trans._reqack,
+ trans._reqinc,
+ trans.space_wrong1,
+ trans.length_data,
+ trans.address,
+ trans._data);
+ end
+ default:
+ begin
+ `uvm_fatal("UNEXPECTED VALUE","Command should be text or command or wrong")
+ end
+ endcase
+ uart_inf.wait_idle_time(trans.time_after*trans.scale);
+endtask:drive_data
\ No newline at end of file
trunk/tb/agent/driver/uart_driver.svh
Property changes :
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/svn-commit.tmp
===================================================================
--- trunk/svn-commit.tmp (nonexistent)
+++ trunk/svn-commit.tmp (revision 2)
@@ -0,0 +1,64 @@
+
+--This line, and those below, will be ignored--
+
+A buad_rate_calculation
+A buad_rate_calculation/buad_rate_calculations
+A buad_rate_calculation/buad_rate_calculations/bin
+A buad_rate_calculation/buad_rate_calculations/bin/Debug
+AM buad_rate_calculation/buad_rate_calculations/bin/Debug/buad_rate_calculations.exe
+AM buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.cbp
+AM buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.depend
+AM buad_rate_calculation/buad_rate_calculations/buad_rate_calculations.layout
+AM buad_rate_calculation/buad_rate_calculations/main.cpp
+A buad_rate_calculation/buad_rate_calculations/obj
+A buad_rate_calculation/buad_rate_calculations/obj/Debug
+A doc
+AM doc/.~lock.uart2bus_verification_plan.odt#
+AM doc/UART to Bus Core Specifications.pdf
+AM doc/uart2bus_core.dia
+AM doc/uart2bus_core.jpeg
+AM doc/uart2bus_core.png
+AM doc/uart2bus_tb.dia
+AM doc/uart2bus_tb.jpeg
+AM doc/uart2bus_tb.png
+AM doc/uart2bus_tb.svg
+AM doc/uart2bus_verification_plan.docx
+AM doc/uart2bus_verification_plan.odt
+AM doc/uart2bus_verification_plan.pdf
+A rtl
+AM rtl/baud_gen.v
+AM rtl/uart2bus_top.v
+AM rtl/uart_parser.v
+AM rtl/uart_rx.v
+AM rtl/uart_top.v
+AM rtl/uart_tx.v
+A tb
+A tb/agent
+AM tb/agent/agent_pkg.sv
+A tb/agent/configuration
+AM tb/agent/configuration/uart_config.svh
+A tb/agent/driver
+AM tb/agent/driver/uart_driver.svh
+A tb/agent/monitor
+AM tb/agent/monitor/uart_monitor.svh
+A tb/agent/sequence
+AM tb/agent/sequence/uart_sequence.svh
+A tb/agent/transaction
+AM tb/agent/transaction/uart_transaction.svh
+AM tb/agent/uart_agent.svh
+A tb/analysis
+AM tb/analysis/uart_scoreboard.svh
+AM tb/defin_lib.svh
+AM tb/draft
+A tb/env
+AM tb/env/env_pkg.sv
+AM tb/env/uart_env.svh
+A tb/interfaces
+AM tb/interfaces/rf_interface.sv
+AM tb/interfaces/uart_arbiter.sv
+AM tb/interfaces/uart_interface.sv
+AM tb/run.do
+A tb/test
+AM tb/test/uart_test.svh
+AM tb/uart_pkg.sv
+AM tb/uart_top.sv
© copyright 1999-2024
OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.