blob: de5e1480dc7666eb8ac83b9185d406fc3349ad13 [file] [log] [blame]
//
// -------------------------------------------------------------
// Copyright 2004-2008 Synopsys, Inc.
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
// -------------------------------------------------------------
//
`include "vmm_hw_rtl.sv"
module bfm_write(output reg push_req_n, pop_req_n,
output reg [15:0] data_in,
input [15:0] data_out,
input rst );
//
// Clock control
//
wire uclk, ureset, posedge_en, negedge_en;
wire posedge_rdy = 1;
wire negedge_rdy = 1;
vmm_hw_clock_control clk1(uclk, urst,
posedge_rdy, posedge_en,
negedge_rdy, negedge_en);
// Interpret 33-bit messages as push/pop, data and data rate
// and apply to DUT
wire [32:0] drv_msg;
reg drv_rx_rdy;
wire drv_tx_rdy;
vmm_hw_in_if #(33) msg1(drv_rx_rdy, drv_tx_rdy, drv_msg, uclk, urst);
reg [15:0] datarate, data;
reg command;
reg [1:0] drv_state;
parameter WAIT = 0;
parameter DATARATING = 1;
parameter PUSHPOP = 2;
reg [7:0] counter;
always @(posedge uclk)
begin
if (urst || rst) begin
drv_state <= WAIT;
drv_rx_rdy <= 1;
push_req_n <= 1;
pop_req_n <= 1;
end
else begin
case (drv_state)
WAIT: begin
if (drv_tx_rdy) begin
data_in <= drv_msg[31:16];
datarate <= drv_msg[15:0];
command <= drv_msg[32];
drv_rx_rdy <= 0;
drv_state <= DATARATING;
// synopsys translate_off
$write("Command is %s %h@%0d", (drv_msg[32]) ? "PSH" : "POP" ,
drv_msg[31:16], drv_msg[15:0]);
// synopsys translate_on
end
end
DATARATING: begin
if (posedge_en) begin
if (datarate == 0) begin
drv_state <= PUSHPOP;
if (command) push_req_n <= 0;
else pop_req_n <= 0;
end
else datarate <= datarate - 1;
end
end
PUSHPOP: begin
if (posedge_en) begin
drv_rx_rdy <= 1;
push_req_n <= 1;
pop_req_n <= 1;
drv_state <= WAIT;
end
end
endcase
end
end
// Send an observed POP operation back to the testbench as a 32-bit message
reg [31:0] mon_msg;
reg mon_tx_rdy;
wire mon_rx_rdy;
vmm_hw_out_if #(32) msg2(mon_tx_rdy, mon_rx_rdy, mon_msg, uclk, urst);
reg mon_state;
parameter WAIT4POP = 0;
parameter XFER_MSG = 1;
always @(posedge uclk)
begin
if (urst || rst) begin
mon_tx_rdy <= 0;
mon_state <= WAIT4POP;
end
else begin
case (mon_state)
WAIT4POP: begin
if (!pop_req_n && posedge_en) begin
mon_msg <= data_out;
mon_tx_rdy <= 1;
mon_state <= XFER_MSG;
// synopsys translate_off
$display("Sending Message %h from bfm ", data_out);
// synopsys translate_on
end
end
XFER_MSG: begin
if (mon_rx_rdy) begin
mon_tx_rdy <= 0;
mon_state <= WAIT4POP;
end
end
endcase
end
end
endmodule