// Assume bus responses are well-formed, assert that bus requests are
// well-formed.

module tb;

reg clk;
reg rst_n = 1'b0;
always @ (posedge clk)
	rst_n <= 1'b1;

// ----------------------------------------------------------------------------
// DUT

(* keep *) wire [31:0]       ahblm_haddr;
(* keep *) wire              ahblm_hwrite;
(* keep *) wire              ahblm_hexcl;
(* keep *) wire [1:0]        ahblm_htrans;
(* keep *) wire [2:0]        ahblm_hsize;
(* keep *) wire [2:0]        ahblm_hburst;
(* keep *) wire [3:0]        ahblm_hprot;
(* keep *) wire              ahblm_hmastlock;
(* keep *) wire              ahblm_hready;
(* keep *) wire              ahblm_hexokay;
(* keep *) wire              ahblm_hresp;
(* keep *) wire [31:0]       ahblm_hwdata;
(* keep *) wire [31:0]       ahblm_hrdata;

localparam W_DATA = 32;

(* keep *) wire              dbg_req_halt;
(* keep *) wire              dbg_req_halt_on_reset;
(* keep *) wire              dbg_req_resume;
(* keep *) wire              dbg_halted;
(* keep *) wire              dbg_running;
(* keep *) wire [W_DATA-1:0] dbg_data0_rdata;
(* keep *) wire [W_DATA-1:0] dbg_data0_wdata;
(* keep *) wire              dbg_data0_wen;
(* keep *) wire [W_DATA-1:0] dbg_instr_data;
(* keep *) wire              dbg_instr_data_vld;
(* keep *) wire              dbg_instr_data_rdy;
(* keep *) wire              dbg_instr_caught_exception;
(* keep *) wire              dbg_instr_caught_ebreak;

(* keep *) wire [31:0]       irq;
(* keep *) wire              soft_irq;
(* keep *) wire              timer_irq;

hazard3_cpu_1port dut (
	.clk                        (clk),
	.rst_n                      (rst_n),

	.ahblm_haddr                (ahblm_haddr),
	.ahblm_hwrite               (ahblm_hwrite),
	.ahblm_hexcl                (ahblm_hexcl),
	.ahblm_htrans               (ahblm_htrans),
	.ahblm_hsize                (ahblm_hsize),
	.ahblm_hburst               (ahblm_hburst),
	.ahblm_hprot                (ahblm_hprot),
	.ahblm_hmastlock            (ahblm_hmastlock),
	.ahblm_hready               (ahblm_hready),
	.ahblm_hexokay              (ahblm_hexokay),
	.ahblm_hresp                (ahblm_hresp),
	.ahblm_hwdata               (ahblm_hwdata),
	.ahblm_hrdata               (ahblm_hrdata),

	.dbg_req_halt               (dbg_req_halt),
	.dbg_req_halt_on_reset      (dbg_req_halt_on_reset),
	.dbg_req_resume             (dbg_req_resume),
	.dbg_halted                 (dbg_halted),
	.dbg_running                (dbg_running),
	.dbg_data0_rdata            (dbg_data0_rdata),
	.dbg_data0_wdata            (dbg_data0_wdata),
	.dbg_data0_wen              (dbg_data0_wen),
	.dbg_instr_data             (dbg_instr_data),
	.dbg_instr_data_vld         (dbg_instr_data_vld),
	.dbg_instr_data_rdy         (dbg_instr_data_rdy),
	.dbg_instr_caught_exception (dbg_instr_caught_exception),
	.dbg_instr_caught_ebreak    (dbg_instr_caught_ebreak),

	.irq                        (irq),
	.soft_irq                   (soft_irq),
	.timer_irq                  (timer_irq)
);

// ----------------------------------------------------------------------------
// Bus properties

// -1 -> unconstrained, >=0 -> max length
localparam MAX_BUS_STALL = -1;

ahbl_slave_assumptions #(
	.MAX_BUS_STALL (MAX_BUS_STALL)
) d_assumptions (
	.clk             (clk),
	.rst_n           (rst_n),

	.dst_hready_resp (ahblm_hready),
	.dst_hready      (ahblm_hready),
	.dst_hresp       (ahblm_hresp),
	.dst_hexokay     (ahblm_hexokay),
	.dst_haddr       (ahblm_haddr),
	.dst_hwrite      (ahblm_hwrite),
	.dst_htrans      (ahblm_htrans),
	.dst_hsize       (ahblm_hsize),
	.dst_hburst      (ahblm_hburst),
	.dst_hprot       (ahblm_hprot),
	.dst_hmastlock   (ahblm_hmastlock),
	.dst_hexcl       (ahblm_hexcl),
	.dst_hwdata      (ahblm_hwdata),
	.dst_hrdata      (ahblm_hrdata)
);

ahbl_master_assertions d_assertions (
	.clk             (clk),
	.rst_n           (rst_n),

	.src_hready      (ahblm_hready),
	.src_hresp       (ahblm_hresp),
	.src_hexokay     (ahblm_hexokay),
	.src_haddr       (ahblm_haddr),
	.src_hwrite      (ahblm_hwrite),
	.src_htrans      (ahblm_htrans),
	.src_hsize       (ahblm_hsize),
	.src_hburst      (ahblm_hburst),
	.src_hprot       (ahblm_hprot),
	.src_hmastlock   (ahblm_hmastlock),
	.src_hexcl       (ahblm_hexcl),
	.src_hwdata      (ahblm_hwdata),
	.src_hrdata      (ahblm_hrdata)
);

endmodule