Line 66... |
Line 66... |
// Creator: Dan Gisselquist, Ph.D.
|
// Creator: Dan Gisselquist, Ph.D.
|
// Gisselquist Technology, LLC
|
// Gisselquist Technology, LLC
|
//
|
//
|
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
//
|
//
|
// Copyright (C) 2015-2017, Gisselquist Technology, LLC
|
// Copyright (C) 2015-2018, Gisselquist Technology, LLC
|
//
|
//
|
// This program is free software (firmware): you can redistribute it and/or
|
// This program is free software (firmware): you can redistribute it and/or
|
// modify it under the terms of the GNU General Public License as published
|
// modify it under the terms of the GNU General Public License as published
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// by the Free Software Foundation, either version 3 of the License, or (at
|
// your option) any later version.
|
// your option) any later version.
|
Line 185... |
Line 185... |
);
|
);
|
|
|
// AXI4LITE signals
|
// AXI4LITE signals
|
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;
|
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;
|
reg axi_awready;
|
reg axi_awready;
|
reg axi_wready;
|
|
// reg [1 : 0] axi_bresp;
|
// reg [1 : 0] axi_bresp;
|
reg axi_bvalid;
|
reg axi_bvalid;
|
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;
|
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;
|
reg axi_arready;
|
reg axi_arready;
|
// reg [1 : 0] axi_rresp;
|
// reg [1 : 0] axi_rresp;
|
reg axi_rvalid;
|
|
|
|
|
|
wire write_stb;
|
wire write_stb;
|
|
|
///////////////////////////////////////////////////
|
///////////////////////////////////////////////////
|
Line 212... |
Line 210... |
// file.
|
// file.
|
//
|
//
|
// Gisselquist Technology, LLC, claims no copyright
|
// Gisselquist Technology, LLC, claims no copyright
|
// or ownership of this section of the code.
|
// or ownership of this section of the code.
|
//
|
//
|
wire i_reset;
|
wire i_reset, axi_bstall, axi_rstall;
|
assign i_reset = !S_AXI_ARESETN;
|
assign i_reset = !S_AXI_ARESETN;
|
|
|
always @(posedge S_AXI_ACLK)
|
always @(*)
|
if (i_reset)
|
if ((!axi_bstall)&&(S_AXI_AWVALID)&&(S_AXI_WVALID))
|
axi_awready <= 1'b0;
|
|
else if ((!axi_awready)&&(S_AXI_AWVALID)&&(S_AXI_WVALID))
|
|
axi_awready <= 1'b1;
|
axi_awready <= 1'b1;
|
else
|
else
|
axi_awready <= 1'b0;
|
axi_awready <= 1'b0;
|
assign S_AXI_AWREADY = axi_awready;
|
assign S_AXI_AWREADY = axi_awready;
|
|
assign S_AXI_WREADY = axi_awready;
|
|
|
always @(posedge S_AXI_ACLK)
|
always @(posedge S_AXI_ACLK)
|
if ((!axi_awready)&&(S_AXI_AWVALID)&&(S_AXI_WVALID))
|
if ((S_AXI_AWVALID)&&(S_AXI_AWREADY))
|
axi_awaddr <= S_AXI_AWADDR;
|
axi_awaddr <= S_AXI_AWADDR;
|
|
|
|
initial axi_bvalid = 0;
|
always @(posedge S_AXI_ACLK)
|
always @(posedge S_AXI_ACLK)
|
if (i_reset)
|
if (i_reset)
|
axi_wready <= 1'b0;
|
|
else if ((!axi_wready)&&(S_AXI_WVALID)&&(S_AXI_AWVALID))
|
|
axi_wready <= 1'b1;
|
|
else
|
|
axi_wready <= 1'b0;
|
|
assign S_AXI_WREADY = axi_wready;
|
|
|
|
always @(posedge S_AXI_ACLK)
|
|
if (i_reset)
|
|
begin
|
|
axi_bvalid <= 0;
|
axi_bvalid <= 0;
|
// axi_bresp <= 2'b00;
|
else if (write_stb)
|
end else if ((~axi_bvalid)&&(write_stb))
|
|
begin
|
|
axi_bvalid <= 1'b1;
|
axi_bvalid <= 1'b1;
|
// axi_bresp <= 2'b00; // 'Okay' response
|
else if (S_AXI_BREADY)
|
end else if ((S_AXI_BREADY)&&(axi_bvalid))
|
|
axi_bvalid <= 1'b0;
|
axi_bvalid <= 1'b0;
|
assign S_AXI_BRESP = 2'b00; // An 'OKAY' response
|
assign S_AXI_BRESP = 2'b00; // An 'OKAY' response
|
assign S_AXI_BVALID= axi_bvalid;
|
assign S_AXI_BVALID= axi_bvalid;
|
|
|
|
assign axi_bstall = (S_AXI_BVALID)&&(!S_AXI_BREADY);
|
|
|
|
|
|
always @(*)
|
|
if (i_reset)
|
|
axi_arready = 1'b0;
|
|
else if (axi_rstall)
|
|
axi_arready = 1'b0;
|
|
else
|
|
axi_arready = 1'b1;
|
|
|
always @(posedge S_AXI_ACLK)
|
always @(posedge S_AXI_ACLK)
|
if (i_reset)
|
if (i_reset)
|
begin
|
|
axi_arready <= 1'b0;
|
|
axi_araddr <= 0;
|
axi_araddr <= 0;
|
end else if ((!axi_arready)&&(S_AXI_ARVALID))
|
else if ((axi_arready)&&(S_AXI_ARVALID))
|
begin
|
|
axi_arready <= 1'b1;
|
|
axi_araddr <= S_AXI_ARADDR;
|
axi_araddr <= S_AXI_ARADDR;
|
end else
|
|
axi_arready <= 1'b0;
|
|
assign S_AXI_ARREADY = axi_arready;
|
assign S_AXI_ARREADY = axi_arready;
|
|
|
|
reg [1:0] rvalid;
|
|
initial rvalid = 2'b00;
|
always @(posedge S_AXI_ACLK)
|
always @(posedge S_AXI_ACLK)
|
if (i_reset)
|
if (i_reset)
|
begin
|
rvalid <= 2'b00;
|
axi_rvalid <= 0;
|
else if ((axi_arready)&&(S_AXI_ARVALID))
|
// axi_rresp <= 0;
|
rvalid <= 2'b01;
|
end else if ((axi_arready)&&(S_AXI_ARVALID)&&(!axi_rvalid))
|
else if (rvalid == 2'b01)
|
begin
|
rvalid <= 2'b10;
|
axi_rvalid <= 1'b0;
|
else if (S_AXI_RREADY)
|
// axi_rresp <= 2'b00;
|
rvalid <= 2'b00;
|
end else if ((axi_rvalid)&&(S_AXI_RREADY))
|
|
axi_rvalid <= 1'b0;
|
assign S_AXI_RVALID = rvalid[1];
|
assign S_AXI_RVALID = axi_rvalid;
|
|
assign S_AXI_RRESP = 2'b00;
|
assign S_AXI_RRESP = 2'b00;
|
|
|
|
assign axi_rstall = ((rvalid[0])||(S_AXI_RVALID)&&(!S_AXI_RREADY));
|
|
|
|
|
|
|
///////////////////////////////////////////////////
|
///////////////////////////////////////////////////
|
//
|
//
|
Line 312... |
Line 303... |
wire read_from_data;
|
wire read_from_data;
|
assign read_from_data = (S_AXI_ARVALID)&&(S_AXI_ARREADY)
|
assign read_from_data = (S_AXI_ARVALID)&&(S_AXI_ARREADY)
|
&&(axi_araddr[0]);
|
&&(axi_araddr[0]);
|
|
|
assign write_stb = ((axi_awready)&&(S_AXI_AWVALID)
|
assign write_stb = ((axi_awready)&&(S_AXI_AWVALID)
|
&&(axi_wready)&&(S_AXI_WVALID));
|
&&(S_AXI_WVALID));
|
wire write_to_control;
|
wire write_to_control;
|
assign write_to_control = (write_stb)&&(!axi_awaddr[0]);
|
assign write_to_control = (write_stb)&&(!axi_awaddr[0]);
|
|
|
reg read_address;
|
reg read_address;
|
always @(posedge bus_clock)
|
always @(posedge bus_clock)
|
|
if ((axi_arready)&&(S_AXI_ARVALID))
|
read_address <= axi_araddr[0];
|
read_address <= axi_araddr[0];
|
|
|
wire [31:0] i_wb_data;
|
wire [31:0] i_wb_data;
|
assign i_wb_data = S_AXI_WDATA;
|
assign i_wb_data = S_AXI_WDATA;
|
|
|
Line 377... |
Line 369... |
(* ASYNC_REG = "TRUE" *) reg [2:0] q_iflags;
|
(* ASYNC_REG = "TRUE" *) reg [2:0] q_iflags;
|
reg [2:0] r_iflags;
|
reg [2:0] r_iflags;
|
|
|
// Resets are synchronous to the bus clock, not the data clock
|
// Resets are synchronous to the bus clock, not the data clock
|
// so do a clock transfer here
|
// so do a clock transfer here
|
initial q_iflags = 3'b000;
|
initial { q_iflags, r_iflags } = 6'h0;
|
initial r_reset_complete = 1'b0;
|
initial r_reset_complete = 1'b0;
|
always @(posedge i_data_clk)
|
always @(posedge i_data_clk)
|
begin
|
begin
|
q_iflags <= { bw_reset_request, bw_manual_trigger, bw_disable_trigger };
|
q_iflags <= { bw_reset_request, bw_manual_trigger, bw_disable_trigger };
|
r_iflags <= q_iflags;
|
r_iflags <= q_iflags;
|
Line 403... |
Line 395... |
q_reset_complete <= r_reset_complete;
|
q_reset_complete <= r_reset_complete;
|
qq_reset_complete <= q_reset_complete;
|
qq_reset_complete <= q_reset_complete;
|
end
|
end
|
|
|
assign bw_reset_complete = qq_reset_complete;
|
assign bw_reset_complete = qq_reset_complete;
|
|
|
|
`ifdef FORMAL
|
|
always @($global_clock)
|
|
if (f_past_valid_data)
|
|
begin
|
|
if ($rose(r_reset_complete))
|
|
assert(bw_reset_request);
|
|
end
|
|
`endif
|
end endgenerate
|
end endgenerate
|
|
|
//
|
//
|
// Set up the trigger
|
// Set up the trigger
|
//
|
//
|
Line 437... |
Line 438... |
initial counter = 0;
|
initial counter = 0;
|
always @(posedge i_data_clk)
|
always @(posedge i_data_clk)
|
if (dw_reset)
|
if (dw_reset)
|
counter <= 0;
|
counter <= 0;
|
else if ((i_ce)&&(dr_triggered)&&(!dr_stopped))
|
else if ((i_ce)&&(dr_triggered)&&(!dr_stopped))
|
begin
|
|
counter <= counter + 1'b1;
|
counter <= counter + 1'b1;
|
end
|
|
always @(posedge i_data_clk)
|
always @(posedge i_data_clk)
|
if ((!dr_triggered)||(dw_reset))
|
if ((!dr_triggered)||(dw_reset))
|
dr_stopped <= 1'b0;
|
dr_stopped <= 1'b0;
|
else if (HOLDOFFBITS > 1) // if (i_ce)
|
else if (HOLDOFFBITS > 1) // if (i_ce)
|
dr_stopped <= (counter >= br_holdoff);
|
dr_stopped <= (counter >= br_holdoff);
|
Line 549... |
Line 549... |
assign bw_triggered = r_oflags[1];
|
assign bw_triggered = r_oflags[1];
|
assign bw_primed = r_oflags[0];
|
assign bw_primed = r_oflags[0];
|
end endgenerate
|
end endgenerate
|
|
|
// Reads use the bus clock
|
// Reads use the bus clock
|
|
initial raddr = 0;
|
always @(posedge bus_clock)
|
always @(posedge bus_clock)
|
begin
|
begin
|
if ((bw_reset_request)||(write_to_control))
|
if ((bw_reset_request)||(write_to_control))
|
raddr <= 0;
|
raddr <= 0;
|
else if ((read_from_data)&&(bw_stopped))
|
else if ((read_from_data)&&(bw_stopped))
|
raddr <= raddr + 1'b1; // Data read, when stopped
|
raddr <= raddr + 1'b1; // Data read, when stopped
|
end
|
end
|
|
|
reg [(LGMEM-1):0] this_addr;
|
reg [(LGMEM-1):0] this_addr;
|
always @(posedge bus_clock)
|
always @(posedge bus_clock)
|
if (read_from_data)
|
if ((bw_stopped)&&(read_from_data))
|
this_addr <= raddr + waddr + 1'b1;
|
this_addr <= raddr + waddr + 1'b1;
|
else
|
else
|
this_addr <= raddr + waddr;
|
this_addr <= raddr + waddr;
|
|
|
reg [31:0] nxt_mem;
|
reg [31:0] nxt_mem;
|
always @(posedge bus_clock)
|
always @(posedge bus_clock)
|
|
if (read_from_data)
|
nxt_mem <= mem[this_addr];
|
nxt_mem <= mem[this_addr];
|
|
|
wire [19:0] full_holdoff;
|
wire [19:0] full_holdoff;
|
assign full_holdoff[(HOLDOFFBITS-1):0] = br_holdoff;
|
assign full_holdoff[(HOLDOFFBITS-1):0] = br_holdoff;
|
generate if (HOLDOFFBITS < 20)
|
generate if (HOLDOFFBITS < 20)
|
Line 578... |
Line 580... |
|
|
reg [31:0] o_bus_data;
|
reg [31:0] o_bus_data;
|
wire [4:0] bw_lgmem;
|
wire [4:0] bw_lgmem;
|
assign bw_lgmem = LGMEM;
|
assign bw_lgmem = LGMEM;
|
always @(posedge bus_clock)
|
always @(posedge bus_clock)
|
|
if (rvalid[0])
|
|
begin
|
if (!read_address) // Control register read
|
if (!read_address) // Control register read
|
o_bus_data <= { bw_reset_request,
|
o_bus_data <= { bw_reset_request,
|
bw_stopped,
|
bw_stopped,
|
bw_triggered,
|
bw_triggered,
|
bw_primed,
|
bw_primed,
|
Line 592... |
Line 596... |
full_holdoff };
|
full_holdoff };
|
else if (!bw_stopped) // read, prior to stopping
|
else if (!bw_stopped) // read, prior to stopping
|
o_bus_data <= i_data;
|
o_bus_data <= i_data;
|
else // if (i_wb_addr) // Read from FIFO memory
|
else // if (i_wb_addr) // Read from FIFO memory
|
o_bus_data <= nxt_mem; // mem[raddr+waddr];
|
o_bus_data <= nxt_mem; // mem[raddr+waddr];
|
|
end
|
|
|
assign S_AXI_RDATA = o_bus_data;
|
assign S_AXI_RDATA = o_bus_data;
|
|
|
reg br_level_interrupt;
|
reg br_level_interrupt;
|
initial br_level_interrupt = 1'b0;
|
initial br_level_interrupt = 1'b0;
|
Line 612... |
Line 617... |
wire [44:0] unused;
|
wire [44:0] unused;
|
assign unused = { S_AXI_WSTRB, S_AXI_ARPROT, S_AXI_AWPROT,
|
assign unused = { S_AXI_WSTRB, S_AXI_ARPROT, S_AXI_AWPROT,
|
axi_awaddr[3:1], axi_araddr[3:1],
|
axi_awaddr[3:1], axi_araddr[3:1],
|
i_wb_data[30:28], i_wb_data[25:0] };
|
i_wb_data[30:28], i_wb_data[25:0] };
|
// verilator lint_on UNUSED
|
// verilator lint_on UNUSED
|
|
`ifdef FORMAL
|
|
generate if (SYNCHRONOUS)
|
|
begin
|
|
|
|
always @(*)
|
|
assume(i_data_clk == S_AXI_ACLK);
|
|
|
|
end else begin
|
|
localparam CKSTEP_BITS = 3;
|
|
localparam [CKSTEP_BITS-1:0]
|
|
MAX_STEP = { 1'b0, {(CKSTEP_BITS-1){1'b1}} };
|
|
|
|
// "artificially" generate two clocks
|
|
`ifdef VERIFIC
|
|
(* gclk *) wire gbl_clock;
|
|
global clocking @(posedge gbl_clock); endclocking
|
|
`endif
|
|
|
|
(* anyconst *) wire [CKSTEP_BITS-1:0] f_data_step, f_bus_step;
|
|
reg [CKSTEP_BITS-1:0] f_data_count, f_bus_count;
|
|
|
|
always @(*)
|
|
begin
|
|
assume(f_data_step > 0);
|
|
assume(f_bus_step > 0);
|
|
assume(f_data_step <= MAX_STEP);
|
|
assume(f_bus_step <= MAX_STEP);
|
|
|
|
assume((f_data_step == MAX_STEP)
|
|
||(f_bus_step == MAX_STEP));
|
|
end
|
|
|
|
always @($global_clock)
|
|
begin
|
|
f_data_count <= f_data_count + f_data_step;
|
|
f_bus_count <= f_bus_count + f_bus_step;
|
|
|
|
assume(i_data_clk == f_data_count[CKSTEP_BITS-1]);
|
|
assume(bus_clock == f_bus_count[CKSTEP_BITS-1]);
|
|
end
|
|
|
|
always @($global_clock)
|
|
if (!$rose(i_data_clk))
|
|
begin
|
|
assume($stable(i_trigger));
|
|
assume($stable(i_data));
|
|
end
|
|
|
|
always @($global_clock)
|
|
if (!$rose(S_AXI_ACLK))
|
|
begin
|
|
assume($stable(S_AXI_ARESETN));
|
|
//
|
|
assume($stable(S_AXI_AWADDR));
|
|
assume($stable(S_AXI_AWPROT));
|
|
assume($stable(S_AXI_AWVALID));
|
|
//
|
|
assume($stable(S_AXI_WDATA));
|
|
assume($stable(S_AXI_WSTRB));
|
|
assume($stable(S_AXI_WVALID));
|
|
//
|
|
assume($stable(S_AXI_BREADY));
|
|
//
|
|
assume($stable(S_AXI_ARADDR));
|
|
assume($stable(S_AXI_ARPROT));
|
|
assume($stable(S_AXI_ARVALID));
|
|
//
|
|
assume($stable(S_AXI_RREADY));
|
|
//
|
|
end
|
|
|
|
end endgenerate
|
|
|
|
reg f_past_valid_bus, f_past_valid_gbl, f_past_valid_data;
|
|
initial { f_past_valid_bus, f_past_valid_gbl, f_past_valid_data }= 3'b0;
|
|
always @(posedge S_AXI_ACLK)
|
|
f_past_valid_bus = 1'b1;
|
|
|
|
generate if (!SYNCHRONOUS)
|
|
begin
|
|
always @($global_clock)
|
|
f_past_valid_gbl <= 1'b1;
|
|
|
|
always @(posedge i_data_clk)
|
|
f_past_valid_data = 1'b1;
|
|
|
|
always @(posedge i_data_clk)
|
|
if (f_past_valid_data)
|
|
assert($stable(o_interrupt));
|
|
|
|
always @($global_clock)
|
|
if ((f_past_valid_gbl)&&(!$rose(S_AXI_ACLK)))
|
|
begin
|
|
assert($stable(S_AXI_AWREADY));
|
|
assert($stable(S_AXI_ARREADY));
|
|
assert($stable(S_AXI_RDATA));
|
|
assert($stable(S_AXI_RRESP));
|
|
assert($stable(S_AXI_RVALID));
|
|
assert($stable(S_AXI_WREADY));
|
|
assert($stable(S_AXI_BRESP));
|
|
assert($stable(S_AXI_BVALID));
|
|
end
|
|
|
|
end else begin
|
|
|
|
always @(*)
|
|
f_past_valid_data = f_past_valid_bus;
|
|
always @(*)
|
|
f_past_valid_gbl = f_past_valid_bus;
|
|
|
|
end endgenerate
|
|
|
|
localparam F_LGDEPTH = 5;
|
|
wire [F_LGDEPTH-1:0] f_axi_rd_outstanding,
|
|
f_axi_wr_outstanding,
|
|
f_axi_awr_outstanding;
|
|
|
|
faxil_slave #(
|
|
// .C_S_AXI_DATA_WIDth(C_S_AXI_DATA_WIDTH),
|
|
// Width of S_AXI address bus
|
|
.C_AXI_ADDR_WIDTH(C_S_AXI_ADDR_WIDTH),
|
|
.F_LGDEPTH(F_LGDEPTH),
|
|
.F_OPT_HAS_CACHE(1'b0),
|
|
// .F_OPT_CLK2FFLOGIC(!SYNCHRONOUS),
|
|
.F_AXI_MAXWAIT(5'h6),
|
|
.F_AXI_MAXDELAY(5'h6),
|
|
) faxil_slave(
|
|
.i_clk(S_AXI_ACLK),
|
|
.i_axi_reset_n(S_AXI_ARESETN),
|
|
//
|
|
.i_axi_awaddr(S_AXI_AWADDR),
|
|
.i_axi_awprot(S_AXI_AWPROT),
|
|
.i_axi_awcache(4'h0),
|
|
.i_axi_awvalid(S_AXI_AWVALID),
|
|
.i_axi_awready(S_AXI_AWREADY),
|
|
//
|
|
.i_axi_wdata(S_AXI_WDATA),
|
|
.i_axi_wstrb(S_AXI_WSTRB),
|
|
.i_axi_wvalid(S_AXI_WVALID),
|
|
.i_axi_wready(S_AXI_WREADY),
|
|
//
|
|
.i_axi_bresp(S_AXI_BRESP),
|
|
.i_axi_bvalid(S_AXI_BVALID),
|
|
.i_axi_bready(S_AXI_BREADY),
|
|
//
|
|
.i_axi_araddr(S_AXI_ARADDR),
|
|
.i_axi_arprot(S_AXI_ARPROT),
|
|
.i_axi_arvalid(S_AXI_ARVALID),
|
|
.i_axi_arready(S_AXI_ARREADY),
|
|
.i_axi_arcache(4'h0),
|
|
//
|
|
.i_axi_rdata(S_AXI_RDATA),
|
|
.i_axi_rresp(S_AXI_RRESP),
|
|
.i_axi_rvalid(S_AXI_RVALID),
|
|
.i_axi_rready(S_AXI_RREADY),
|
|
//
|
|
.f_axi_rd_outstanding(f_axi_rd_outstanding),
|
|
.f_axi_wr_outstanding(f_axi_wr_outstanding),
|
|
.f_axi_awr_outstanding(f_axi_awr_outstanding));
|
|
|
|
always @(*)
|
|
begin
|
|
assert(f_axi_wr_outstanding == f_axi_awr_outstanding);
|
|
if (axi_bvalid)
|
|
assert(f_axi_wr_outstanding == 1);
|
|
else
|
|
assert(f_axi_wr_outstanding == 0);
|
|
if (|rvalid)
|
|
assert(f_axi_rd_outstanding == 1);
|
|
else
|
|
assert(f_axi_rd_outstanding == 0);
|
|
assert(rvalid != 2'b11);
|
|
end
|
|
|
|
always @(*)
|
|
if (dr_triggered)
|
|
assert(dr_primed);
|
|
|
|
always @(*)
|
|
if (dr_stopped)
|
|
assert((dr_primed)&&(dr_triggered));
|
|
|
|
reg dr_triggered, dr_primed;
|
|
wire dw_trigger;
|
|
assign dw_trigger = (dr_primed)&&(
|
|
((i_trigger)&&(!dw_disable_trigger))
|
|
||(dw_manual_trigger));
|
|
|
|
(* anyconst *) wire [(LGMEM-1):0] f_addr;
|
|
reg [31:0] f_data;
|
|
reg f_filled;
|
|
|
|
initial f_filled = 1'b0;
|
|
always @(posedge i_data_clk)
|
|
if (dw_reset)
|
|
f_filled <= 1'b0;
|
|
else if ((i_ce)&&(!dr_stopped)&&(waddr == f_addr))
|
|
f_filled <= 1'b1;
|
|
|
|
always @(posedge i_data_clk)
|
|
if (waddr > f_addr)
|
|
assert(f_filled);
|
|
|
|
always @(posedge i_data_clk)
|
|
if (!f_filled)
|
|
assert(!dr_primed);
|
|
|
|
always @(posedge i_data_clk)
|
|
if ((i_ce)&&(!dr_stopped)&&(waddr == f_addr))
|
|
f_data <= wr_piped_data;
|
|
|
|
always @(posedge i_data_clk)
|
|
if (f_filled)
|
|
assert(mem[f_addr] == f_data);
|
|
|
|
`endif
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|