top: pass Wishbone directly to PIO
Signed-off-by: Sean Cross <sean@xobs.io>
diff --git a/verilog/rtl/wb_pio_top.v b/verilog/rtl/wb_pio_top.v
index d8fc045..fc10948 100644
--- a/verilog/rtl/wb_pio_top.v
+++ b/verilog/rtl/wb_pio_top.v
@@ -39,8 +39,16 @@
parameter BITS = 32
)(
`ifdef USE_POWER_PINS
- inout vdd, // User area 1 1.8V supply
- inout vss, // User area 1 digital ground
+ // SKY130
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+ inout vdda1, // User area 1 3.3V supply
+ inout vssa2, // User area 2 analog ground
+ inout vdda2, // User area 2 3.3V supply
+ inout vssd2, // User area 2 digital ground
+ // GF180
+ inout vdd, // User area 1 1.8V supply
+ inout vss, // User area 1 digital ground
`endif
// Wishbone Slave ports (WB MI A)
@@ -83,57 +91,26 @@
wire [31:0] la_write;
// WB MI A
- assign valid = wbs_cyc_i && wbs_stb_i;
+ assign valid = wbs_cyc_i && wbs_stb_i && wbs_adr_i[31:16] == 16'h761c;
assign wstrb = wbs_sel_i & {4{wbs_we_i}};
assign wdata = wbs_dat_i;
// IO
assign io_out = count;
- // assign io_oeb = {(`MPRJ_IO_PADS-1){rst}};
-
- // IRQ
- // assign irq = 3'b000; // Unused
// PIO registers and wires
reg [31:0] din; // Data sent to PIO
reg [4:0] index; // Instruction index
reg [1:0] mindex; // Machine index
- reg [31:0] dout; // Output from PIO
- wire [3:0] action; // Action to be done by PIO
+ reg [31:0] dout; // Output from PIO
+ wire [3:0] action; // Action to be done by PIO
wire irq0, irq1; // IRQ flags from PIO
wire [3:0] tx_full; // Set when TX fifo is full
wire [3:0] rx_empty; // Set when RX fifo is empty
- // // LA
- // assign la_data_out = {{(127-BITS){1'b0}}, count};
- // // Assuming LA probes [63:32] are for controlling the count register
- // assign la_write = ~la_oenb[63:32] & ~{BITS{valid}};
- // // Assuming LA probes [65:64] are for controlling the count clk & reset
- // assign clk = (~la_oenb[64]) ? la_data_in[64]: wb_clk_i;
- // assign rst = (~la_oenb[65]) ? la_data_in[65]: wb_rst_i;
-
- // counter #(
- // .BITS(BITS)
- // ) counter(
- // .clk(clk),
- // .reset(rst),
- // .ready(wbs_ack_o),
- // .valid(valid),
- // .rdata(rdata),
- // .wdata(wbs_dat_i),
- // .wstrb(wstrb),
- // .la_write(la_write),
- // .la_input(la_data_in[63:32]),
- // .count(count)
- // );
-
assign irq[2] = 1'b0;
- reg [3:0] actions[32];
- reg [4:0] pc;
- assign action = actions[pc];
- // assign action = actions[0];
reg ack;
assign wbs_ack_o = ack;
assign wbs_dat_o = dout;
@@ -141,28 +118,26 @@
always @(posedge wb_clk_i) begin
if (wb_rst_i) begin
ack <= 1'b0;
- pc <= 5'b00000;
end else begin
ack <= 1'b0;
- pc <= pc + 1;
if (valid && !ack) begin
ack <= 1'b1;
- if ((wbs_adr_i[3:0] == 0) && wbs_we_i) begin
- if (wstrb[0]) din[7:0] <= wbs_dat_i[7:0];
- if (wstrb[1]) din[15:8] <= wbs_dat_i[15:8];
- if (wstrb[2]) din[23:16] <= wbs_dat_i[23:16];
- if (wstrb[3]) din[31:24] <= wbs_dat_i[31:24];
- end else if ((wbs_adr_i[3:0] == 4) && wbs_we_i) begin
- if (wstrb[0]) mindex[1:0] <= wbs_dat_i[1:0];
- end else if ((wbs_adr_i[3:0] == 8) && wbs_we_i) begin
- if (wstrb[0]) index[4:0] <= wbs_dat_i[4:0];
- end else if ((wbs_adr_i[3:0] == 12) && wbs_we_i) begin
- if (wstrb[0]) actions[pc][3:0] <= wbs_dat_i[3:0];
- // end else if ((wbs_adr_i[3:0] == 16) && !wbs_we_i) begin
- // if (wstrb[0]) wbs_dat_o[7:0] <= dout[7:0];
- // if (wstrb[1]) wbs_dat_o[15:8] <= dout[15:8];
- // if (wstrb[2]) wbs_dat_o[23:16] <= dout[23:16];
- // if (wstrb[3]) wbs_dat_o[31:24] <= dout[31:24];
+ if (wbs_we_i) begin
+ action[3:0] <= wbs_adr_i[5:2];
+ if (wbs_we_i) begin
+ if (wstrb[0]) din[7:0] <= wbs_dat_i[7:0];
+ if (wstrb[1]) din[15:8] <= wbs_dat_i[15:8];
+ if (wstrb[2]) din[23:16] <= wbs_dat_i[23:16];
+ if (wstrb[3]) din[31:24] <= wbs_dat_i[31:24];
+ end else begin
+ if (wstrb[0]) wbs_dat_o[7:0] <= dout[7:0];
+ if (wstrb[1]) wbs_dat_o[15:8] <= dout[15:8];
+ if (wstrb[2]) wbs_dat_o[23:16] <= dout[23:16];
+ if (wstrb[3]) wbs_dat_o[31:24] <= dout[31:24];
+ end
+ end else begin
+ // When there is no action, set the action to `NONE`
+ action[3:0] <= 4'b0000;
end
end
end
@@ -190,45 +165,4 @@
);
endmodule
-// module counter #(
-// parameter BITS = 32
-// )(
-// input clk,
-// input reset,
-// input valid,
-// input [3:0] wstrb,
-// input [BITS-1:0] wdata,
-// input [BITS-1:0] la_write,
-// input [BITS-1:0] la_input,
-// output ready,
-// output [BITS-1:0] rdata,
-// output [BITS-1:0] count
-// );
-// reg ready;
-// reg [BITS-1:0] count;
-// reg [BITS-1:0] rdata;
-
-// always @(posedge clk) begin
-// if (reset) begin
-// count <= 0;
-// ready <= 0;
-// end else begin
-// ready <= 1'b0;
-// if (~|la_write) begin
-// count <= count + 1;
-// end
-// if (valid && !ready) begin
-// ready <= 1'b1;
-// rdata <= count;
-// if (wstrb[0]) count[7:0] <= wdata[7:0];
-// if (wstrb[1]) count[15:8] <= wdata[15:8];
-// if (wstrb[2]) count[23:16] <= wdata[23:16];
-// if (wstrb[3]) count[31:24] <= wdata[31:24];
-// end else if (|la_write) begin
-// count <= la_write & la_input;
-// end
-// end
-// end
-
-// endmodule
`default_nettype wire