adding scope support to xrtsim

This commit is contained in:
Blaise Tine 2024-09-19 22:33:28 -07:00
parent 2d7f9eae0a
commit d2db612bb4
8 changed files with 155 additions and 109 deletions

View file

@ -1,10 +1,10 @@
// Copyright © 2019-2023
//
//
// 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.
@ -24,7 +24,7 @@
`define SCOPE_IO_SWITCH(__count) \
wire scope_bus_in_w [__count]; \
wire scope_bus_out_w [__count]; \
`RESET_RELAY_EX(scope_reset_w, scope_reset, __count, 4); \
`RESET_RELAY_EX(scope_reset_w, scope_reset, __count, `MAX_FANOUT); \
VX_scope_switch #( \
.N (__count) \
) scope_switch ( \

View file

@ -175,7 +175,6 @@ module vortex_afu import ccip_if_pkg::*; import local_mem_cfg_pkg::*; import VX_
cmd_scope_reading <= 1;
scope_bus_ctr <= 63;
end
scope_bus_in <= 0;
if (cp2af_sRxPort.c0.mmioWrValid
&& (MMIO_SCOPE_WRITE == mmio_req_hdr.address)) begin
cmd_scope_wdata <= 64'(cp2af_sRxPort.c0.data);
@ -189,6 +188,7 @@ module vortex_afu import ccip_if_pkg::*; import local_mem_cfg_pkg::*; import VX_
scope_bus_ctr <= scope_bus_ctr - 1;
if (scope_bus_ctr == 0) begin
cmd_scope_writing <= 0;
scope_bus_in <= 0;
end
end
if (cmd_scope_reading) begin

View file

@ -132,13 +132,16 @@ module VX_afu_ctrl #(
ADDR_BITS = 8;
localparam
WSTATE_IDLE = 2'd0,
WSTATE_ADDR = 2'd0,
WSTATE_DATA = 2'd1,
WSTATE_RESP = 2'd2;
WSTATE_RESP = 2'd2,
WSTATE_WIDTH = 2;
localparam
RSTATE_IDLE = 2'd0,
RSTATE_DATA = 2'd1;
RSTATE_ADDR = 2'd0,
RSTATE_DATA = 2'd1,
RSTATE_RESP = 2'd2,
RSTATE_WIDTH = 2;
// device caps
wire [63:0] dev_caps = {16'b0,
@ -152,16 +155,18 @@ module VX_afu_ctrl #(
2'(`CLOG2(`XLEN)-4),
30'(`MISA_STD)};
reg [1:0] wstate;
reg [WSTATE_WIDTH-1:0] wstate;
reg [ADDR_BITS-1:0] waddr;
wire [31:0] wmask;
wire s_axi_aw_fire;
wire s_axi_w_fire;
wire s_axi_b_fire;
reg [1:0] rstate;
logic [RSTATE_WIDTH-1:0] rstate;
reg [31:0] rdata;
wire [ADDR_BITS-1:0] raddr;
reg [ADDR_BITS-1:0] raddr;
wire s_axi_ar_fire;
wire s_axi_r_fire;
reg ap_reset_r;
reg ap_start_r;
@ -174,15 +179,19 @@ module VX_afu_ctrl #(
reg [31:0] dcrv_r;
reg dcr_wr_valid_r;
logic wready_stall;
logic rvalid_stall;
`ifdef SCOPE
reg [63:0] scope_bus_wdata;
reg [63:0] scope_bus_rdata;
reg [63:0] scope_bus_wdata, scope_bus_rdata;
reg [5:0] scope_bus_ctr;
reg cmd_scope_reading;
reg cmd_scope_writing;
reg cmd_scope_writing, cmd_scope_reading;
reg scope_bus_out_r;
reg scope_rdata_valid;
reg is_scope_waddr, is_scope_raddr;
always @(posedge clk) begin
if (reset) begin
@ -190,18 +199,33 @@ module VX_afu_ctrl #(
cmd_scope_writing <= 0;
scope_bus_ctr <= '0;
scope_bus_out_r <= 0;
is_scope_waddr <= 0;
is_scope_raddr <= 0;
scope_bus_rdata <= '0;
scope_rdata_valid <= 0;
end else begin
if (s_axi_aw_fire) begin
is_scope_waddr <= (s_axi_awaddr[ADDR_BITS-1:0] == ADDR_SCP_0)
|| (s_axi_awaddr[ADDR_BITS-1:0] == ADDR_SCP_1);
end
if (s_axi_ar_fire) begin
is_scope_raddr <= (s_axi_araddr[ADDR_BITS-1:0] == ADDR_SCP_0)
|| (s_axi_araddr[ADDR_BITS-1:0] == ADDR_SCP_1);
end
if (s_axi_w_fire && waddr == ADDR_SCP_0) begin
scope_bus_wdata[31:0] <= (s_axi_wdata & wmask) | (scope_bus_wdata[31:0] & ~wmask);
end
if (s_axi_w_fire && waddr == ADDR_SCP_1) begin
scope_bus_wdata[63:32] <= (s_axi_wdata & wmask) | (scope_bus_wdata[63:32] & ~wmask);
cmd_scope_writing <= 1;
scope_rdata_valid <= 0;
scope_bus_out_r <= 1;
scope_bus_ctr <= 63;
end
if (scope_bus_in) begin
cmd_scope_reading <= 1;
scope_bus_rdata <= '0;
scope_bus_ctr <= 63;
end
if (cmd_scope_reading) begin
@ -209,6 +233,7 @@ module VX_afu_ctrl #(
scope_bus_ctr <= scope_bus_ctr - 1;
if (scope_bus_ctr == 0) begin
cmd_scope_reading <= 0;
scope_rdata_valid <= 1;
end
end
if (cmd_scope_writing) begin
@ -216,6 +241,7 @@ module VX_afu_ctrl #(
scope_bus_ctr <= scope_bus_ctr - 1;
if (scope_bus_ctr == 0) begin
cmd_scope_writing <= 0;
scope_bus_out_r <= '0;
end
end
end
@ -223,40 +249,51 @@ module VX_afu_ctrl #(
assign scope_bus_out = scope_bus_out_r;
assign wready_stall = is_scope_waddr && cmd_scope_writing;
assign rvalid_stall = is_scope_raddr && ~scope_rdata_valid;
`else
assign wready_stall = 0;
assign rvalid_stall = 0;
`endif
// AXI Write
// AXI Write Request
assign s_axi_awready = (wstate == WSTATE_ADDR);
assign s_axi_wready = (wstate == WSTATE_DATA) && ~wready_stall;
assign s_axi_awready = (wstate == WSTATE_IDLE);
assign s_axi_wready = (wstate == WSTATE_DATA);
// AXI Write Response
assign s_axi_bvalid = (wstate == WSTATE_RESP);
assign s_axi_bresp = 2'b00; // OKAY
assign s_axi_aw_fire = s_axi_awvalid && s_axi_awready;
assign s_axi_w_fire = s_axi_wvalid && s_axi_wready;
for (genvar i = 0; i < 4; ++i) begin : g_wmask
assign wmask[8 * i +: 8] = {8{s_axi_wstrb[i]}};
end
assign s_axi_aw_fire = s_axi_awvalid && s_axi_awready;
assign s_axi_w_fire = s_axi_wvalid && s_axi_wready;
assign s_axi_b_fire = s_axi_bvalid && s_axi_bready;
// wstate
always @(posedge clk) begin
if (reset) begin
wstate <= WSTATE_IDLE;
wstate <= WSTATE_ADDR;
end else begin
case (wstate)
WSTATE_IDLE: wstate <= s_axi_awvalid ? WSTATE_DATA : WSTATE_IDLE;
WSTATE_DATA: wstate <= s_axi_wvalid ? WSTATE_RESP : WSTATE_DATA;
WSTATE_RESP: wstate <= s_axi_bready ? WSTATE_IDLE : WSTATE_RESP;
default: wstate <= WSTATE_IDLE;
WSTATE_ADDR: wstate <= s_axi_aw_fire ? WSTATE_DATA : WSTATE_ADDR;
WSTATE_DATA: wstate <= s_axi_w_fire ? WSTATE_RESP : WSTATE_DATA;
WSTATE_RESP: wstate <= s_axi_b_fire ? WSTATE_ADDR : WSTATE_RESP;
default: wstate <= WSTATE_ADDR;
endcase
end
end
// waddr
always @(posedge clk) begin
if (s_axi_aw_fire)
if (s_axi_aw_fire) begin
waddr <= s_axi_awaddr[ADDR_BITS-1:0];
end
end
// wdata
@ -335,73 +372,80 @@ module VX_afu_ctrl #(
end
end
// AXI Read
// AXI Read Request
assign s_axi_arready = (rstate == RSTATE_ADDR);
assign s_axi_arready = (rstate == RSTATE_IDLE);
assign s_axi_rvalid = (rstate == RSTATE_DATA);
// AXI Read Response
assign s_axi_rvalid = (rstate == RSTATE_RESP);
assign s_axi_rdata = rdata;
assign s_axi_rresp = 2'b00; // OKAY
assign s_axi_ar_fire = s_axi_arvalid && s_axi_arready;
assign raddr = s_axi_araddr[ADDR_BITS-1:0];
assign s_axi_r_fire = s_axi_rvalid && s_axi_rready;
// rstate
always @(posedge clk) begin
if (reset) begin
rstate <= RSTATE_IDLE;
rstate <= RSTATE_ADDR;
end else begin
case (rstate)
RSTATE_IDLE: rstate <= s_axi_arvalid ? RSTATE_DATA : RSTATE_IDLE;
RSTATE_DATA: rstate <= (s_axi_rready & s_axi_rvalid) ? RSTATE_IDLE : RSTATE_DATA;
default: rstate <= RSTATE_IDLE;
RSTATE_ADDR: rstate <= s_axi_ar_fire ? RSTATE_DATA : RSTATE_ADDR;
RSTATE_DATA: rstate <= (~rvalid_stall) ? RSTATE_RESP : RSTATE_DATA;
RSTATE_RESP: rstate <= s_axi_r_fire ? RSTATE_ADDR : RSTATE_RESP;
default: rstate <= RSTATE_ADDR;
endcase
end
end
// raddr
always @(posedge clk) begin
if (s_axi_ar_fire) begin
raddr <= s_axi_araddr[ADDR_BITS-1:0];
end
end
// rdata
always @(posedge clk) begin
if (s_axi_ar_fire) begin
rdata <= '0;
case (raddr)
ADDR_AP_CTRL: begin
rdata[0] <= ap_start_r;
rdata[1] <= ap_done;
rdata[2] <= ap_idle;
rdata[3] <= ap_ready;
rdata[7] <= auto_restart_r;
end
ADDR_GIE: begin
rdata <= 32'(gie_r);
end
ADDR_IER: begin
rdata <= 32'(ier_r);
end
ADDR_ISR: begin
rdata <= 32'(isr_r);
end
ADDR_DEV_0: begin
rdata <= dev_caps[31:0];
end
ADDR_DEV_1: begin
rdata <= dev_caps[63:32];
end
ADDR_ISA_0: begin
rdata <= isa_caps[31:0];
end
ADDR_ISA_1: begin
rdata <= isa_caps[63:32];
end
`ifdef SCOPE
ADDR_SCP_0: begin
rdata <= scope_bus_rdata[31:0];
end
ADDR_SCP_1: begin
rdata <= scope_bus_rdata[63:32];
end
`endif
default:;
endcase
end
rdata <= '0;
case (raddr)
ADDR_AP_CTRL: begin
rdata[0] <= ap_start_r;
rdata[1] <= ap_done;
rdata[2] <= ap_idle;
rdata[3] <= ap_ready;
rdata[7] <= auto_restart_r;
end
ADDR_GIE: begin
rdata <= 32'(gie_r);
end
ADDR_IER: begin
rdata <= 32'(ier_r);
end
ADDR_ISR: begin
rdata <= 32'(isr_r);
end
ADDR_DEV_0: begin
rdata <= dev_caps[31:0];
end
ADDR_DEV_1: begin
rdata <= dev_caps[63:32];
end
ADDR_ISA_0: begin
rdata <= isa_caps[31:0];
end
ADDR_ISA_1: begin
rdata <= isa_caps[63:32];
end
`ifdef SCOPE
ADDR_SCP_0: begin
rdata <= scope_bus_rdata[31:0];
end
ADDR_SCP_1: begin
rdata <= scope_bus_rdata[63:32];
end
`endif
default:;
endcase
end
assign ap_reset = ap_reset_r;

View file

@ -194,11 +194,10 @@ public:
return device->api_.fpgaReadMMIO64(device->fpga_, 0, MMIO_SCOPE_READ, value);
};
int ret = vx_scope_start(&callback, this, 0, -1);
if (ret != 0) {
CHECK_ERR(vx_scope_start(&callback, this, 0, -1), {
api_.fpgaClose(fpga_);
return ret;
}
return err;
});
}
#endif
return 0;

View file

@ -375,11 +375,9 @@ public:
*value = (((uint64_t)value_hi) << 32) | value_lo;
return 0;
};
int ret = vx_scope_start(&callback, device, 0, -1);
if (ret != 0) {
delete device;
return ret;
}
CHECK_ERR(vx_scope_start(&callback, this, 0, -1), {
return err;
});
}
#endif

View file

@ -217,6 +217,8 @@ public:
}
int mem_write(uint32_t bank_id, uint64_t addr, uint64_t size, const void* data) {
std::lock_guard<std::mutex> guard(mutex_);
if (bank_id >= M_AXI_MEM_NUM_BANKS)
return -1;
uint64_t base_addr = uint64_t(bank_id) * MEM_BANK_SIZE + addr;
@ -230,6 +232,8 @@ public:
}
int mem_read(uint32_t bank_id, uint64_t addr, uint64_t size, void* data) {
std::lock_guard<std::mutex> guard(mutex_);
if (bank_id >= M_AXI_MEM_NUM_BANKS)
return -1;
uint64_t base_addr = uint64_t(bank_id) * MEM_BANK_SIZE + addr;
@ -246,56 +250,57 @@ public:
std::lock_guard<std::mutex> guard(mutex_);
// write address
//printf("%0ld: [sim] register_write: address=0x%x\n", timestamp, offset);
device_->s_axi_ctrl_awvalid = 1;
device_->s_axi_ctrl_awaddr = offset;
auto s_axi_ctrl_awready = device_->s_axi_ctrl_awready;
do {
while (!device_->s_axi_ctrl_awready)
this->tick();
} while (!(s_axi_ctrl_awready || device_->s_axi_ctrl_awready));
this->tick();
device_->s_axi_ctrl_awvalid = 0;
// write data
//printf("%0ld: [sim] register_write: data=0x%x\n", timestamp, value);
device_->s_axi_ctrl_wvalid = 1;
device_->s_axi_ctrl_wdata = value;
device_->s_axi_ctrl_wstrb = 0xf;
auto s_axi_ctrl_wready = device_->s_axi_ctrl_wready;
do {
while (!device_->s_axi_ctrl_wready)
this->tick();
} while (!(s_axi_ctrl_wready || device_->s_axi_ctrl_wready));
this->tick();
device_->s_axi_ctrl_wvalid = 0;
// write response
device_->s_axi_ctrl_bready = 1;
auto s_axi_ctrl_bvalid = device_->s_axi_ctrl_bvalid;
//printf("%0ld: [sim] register_write: response\n", timestamp);
do {
this->tick();
} while (!(s_axi_ctrl_bvalid || device_->s_axi_ctrl_bvalid));
} while (!device_->s_axi_ctrl_bvalid);
device_->s_axi_ctrl_bready = 1;
this->tick();
device_->s_axi_ctrl_bready = 0;
//printf("%0ld: [sim] register_write: done\n", timestamp);
return 0;
}
int register_read(uint32_t offset, uint32_t* value) {
std::lock_guard<std::mutex> guard(mutex_);
// read address
//printf("%0ld: [sim] register_read: address=0x%x\n", timestamp, offset);
device_->s_axi_ctrl_arvalid = 1;
device_->s_axi_ctrl_araddr = offset;
auto s_axi_ctrl_arready = device_->s_axi_ctrl_arready;
do {
while (!device_->s_axi_ctrl_arready)
this->tick();
} while (!(s_axi_ctrl_arready || device_->s_axi_ctrl_arready));
this->tick();
device_->s_axi_ctrl_arvalid = 0;
// read data
device_->s_axi_ctrl_rready = 1;
auto s_axi_ctrl_rvalid = device_->s_axi_ctrl_rvalid;
// read response
//printf("%0ld: [sim] register_read: response\n", timestamp);
do {
this->tick();
} while (!(s_axi_ctrl_rvalid || device_->s_axi_ctrl_rvalid));
} while (!device_->s_axi_ctrl_rvalid);
*value = device_->s_axi_ctrl_rdata;
device_->s_axi_ctrl_rready = 1;
this->tick();
device_->s_axi_ctrl_rready = 0;
//printf("%0ld: [sim] register_read: done (value=0x%x)\n", timestamp, *value);
return 0;
}

View file

@ -102,9 +102,9 @@ run-opae: $(PROJECT) $(KERNEL_SRCS)
run-xrt: $(PROJECT) $(KERNEL_SRCS)
ifeq ($(TARGET), hw)
XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(POCL_PATH)/lib:$(VORTEX_RT_PATH):$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) $(POCL_CC_FLAGS) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
SCOPE_JSON_PATH=$(VORTEX_RT_PATH)/scope.json XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(POCL_PATH)/lib:$(VORTEX_RT_PATH):$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) $(POCL_CC_FLAGS) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
else
XCL_EMULATION_MODE=$(TARGET) XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(POCL_PATH)/lib:$(VORTEX_RT_PATH):$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) $(POCL_CC_FLAGS) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
SCOPE_JSON_PATH=$(VORTEX_RT_PATH)/scope.json XCL_EMULATION_MODE=$(TARGET) XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(POCL_PATH)/lib:$(VORTEX_RT_PATH):$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) $(POCL_CC_FLAGS) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
endif
.depend: $(SRCS)

View file

@ -99,9 +99,9 @@ run-opae: $(PROJECT) kernel.vxbin
run-xrt: $(PROJECT) kernel.vxbin
ifeq ($(TARGET), hw)
XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(VORTEX_RT_PATH):$(LD_LIBRARY_PATH) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
SCOPE_JSON_PATH=$(VORTEX_RT_PATH)/scope.json XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(VORTEX_RT_PATH):$(LD_LIBRARY_PATH) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
else
XCL_EMULATION_MODE=$(TARGET) XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(VORTEX_RT_PATH):$(LD_LIBRARY_PATH) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
SCOPE_JSON_PATH=$(VORTEX_RT_PATH)/scope.json XCL_EMULATION_MODE=$(TARGET) XRT_INI_PATH=$(VORTEX_RT_PATH)/xrt/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(VORTEX_RT_PATH):$(LD_LIBRARY_PATH) VORTEX_DRIVER=xrt ./$(PROJECT) $(OPTS)
endif
.depend: $(SRCS)