Merge remote-tracking branch 'origin/test-bench-pierr0t' into testbench
diff --git a/openlane/computer/config.tcl b/openlane/computer/config.tcl index 4c6779a..f095139 100644 --- a/openlane/computer/config.tcl +++ b/openlane/computer/config.tcl
@@ -25,6 +25,9 @@ set ::env(VERILOG_FILES) "\ $::env(CARAVEL_ROOT)/verilog/rtl/defines.v \ + $script_dir/../../verilog/rtl/jacaranda-8/UART/UART.v \ + $script_dir/../../verilog/rtl/jacaranda-8/UART/rx.v \ + $script_dir/../../verilog/rtl/jacaranda-8/UART/tx.v \ $script_dir/../../verilog/rtl/jacaranda-8/alu.v \ $script_dir/../../verilog/rtl/jacaranda-8/cpu.v \ $script_dir/../../verilog/rtl/jacaranda-8/decoder.v \
diff --git a/verilog/dv/jacaranda_test/jacaranda_test.c b/verilog/dv/jacaranda_test/jacaranda_test.c new file mode 100644 index 0000000..e673d9d --- /dev/null +++ b/verilog/dv/jacaranda_test/jacaranda_test.c
@@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2020 Efabless Corporation + * + * 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. + * SPDX-License-Identifier: Apache-2.0 + */ + +// This include is relative to $CARAVEL_PATH (see Makefile) +#include "verilog/dv/caravel/defs.h" +#include "verilog/dv/caravel/stub.c" + +// -------------------------------------------------------- + +void main() +{ + // Configure LA probes [31:0] as inputs to the cpu + reg_la0_oenb = reg_la0_iena = 0xFFFFFFFF; // [31:0] + + // set reset to high + reg_la0_data = 1 << 16; + + reg_la0_data = 0x00 << 8 | 0b11000000; // ldih 0 + reg_la0_data = 0x01 << 8 | 0b11010000; // ldil 0 + reg_la0_data = 0x02 << 8 | 0b10110011; // jmp r3 +} +
diff --git a/verilog/rtl/jacaranda-8/UART/UART.v b/verilog/rtl/jacaranda-8/UART/UART.v index 5ba66c6..9262a66 100644 --- a/verilog/rtl/jacaranda-8/UART/UART.v +++ b/verilog/rtl/jacaranda-8/UART/UART.v
@@ -3,6 +3,7 @@ module UART( input wire clk, + input wire reset, input wire tx_en, input wire rx_en, input wire begin_flag, @@ -14,10 +15,10 @@ output wire[7:0] rx_data, output wire busy_flag, output wire receive_flag, - output reg int_req = 1'b0 + output reg int_req ); - reg state = 1'b0; + reg state; always @(negedge clk) begin if(state == 1'b0) begin //データ待機中 @@ -36,8 +37,12 @@ end end end + always @(posedge reset) begin + int_req <= 1'b0; + state <= 1'b0; + end - tx tx1(clk, tx_en, begin_flag, tx_data, tx, busy_flag); + tx tx1(clk, reset, tx_en, begin_flag, tx_data, tx, busy_flag); rx rx1(clk, rx_en, rx, rx_data, receive_flag); endmodule
diff --git a/verilog/rtl/jacaranda-8/UART/tx.v b/verilog/rtl/jacaranda-8/UART/tx.v index c3d8dda..f1ceadf 100644 --- a/verilog/rtl/jacaranda-8/UART/tx.v +++ b/verilog/rtl/jacaranda-8/UART/tx.v
@@ -1,9 +1,10 @@ -module tx(clk, tx_en, begin_flag, data, tx, busy_flag); +module tx(clk, reset, tx_en, begin_flag, data, tx, busy_flag); input wire clk; + input wire reset; input wire tx_en; input wire begin_flag; input wire[7:0] data; - output reg tx = 1'b1; + output reg tx; output wire busy_flag; parameter CLK_FREQ = 50_000_000; @@ -18,6 +19,11 @@ assign update_flag = (clk_count == CLK_COUNT_BIT - 32'd1); assign busy_flag = ~(state == 2'b00); + always @(posedge reset) begin + tx <= 1'b1; + state <= 2'b00; + bit_count <= 3'd0; + end always @(posedge clk) begin case(state) 2'b00: begin
diff --git a/verilog/rtl/jacaranda-8/computer.v b/verilog/rtl/jacaranda-8/computer.v index 9d8b6c6..8879dd6 100644 --- a/verilog/rtl/jacaranda-8/computer.v +++ b/verilog/rtl/jacaranda-8/computer.v
@@ -52,8 +52,11 @@ wire [6:0] seg_out_2; wire [6:0] seg_out_3; /** **/ - - assign io_out[7:0] = pc; + // output enable + assign io_oeb[37:36] = 2'b11; + // UART - GPIO + assign io_out[37] = tx; + assign io_out[36] = rx; wire [7:0] instr; wire [7:0] pc; @@ -83,9 +86,13 @@ reg [7:0] nanaseg_in_data; - wire reset = la_data_in[0]; - wire instr_mem_data = wbs_dat_i[7:0]; - wire instr_mem_addr = reset ? wbs_adr_i[7:0] : pc; + wire reset; + wire [7:0] instr_mem_addr; + wire [7:0] instr_mem_data; + + assign reset = la_data_in[16]; + assign instr_mem_addr = reset ? la_data_in[15:8] : pc; + assign instr_mem_data = la_data_in[7:0]; instr_mem instr_mem(.addr(instr_mem_addr), .w_data(instr_mem_data), @@ -93,7 +100,8 @@ .r_data(instr), .clock(wb_clk_i)); - cpu cpu(.clock(wb_clk_i), + cpu cpu(.raw_clock(wb_clk_i), + .reset(reset), .instr(instr), .pc(pc), .rd_data(rd_data), @@ -171,19 +179,20 @@ end end -// UART UART(.clk(wb_clk_i), -// .tx_en(tx_en), -// .rx_en(rx_en), -// .begin_flag(begin_flag), -// .rx(rx), -// .tx_data(tx_data), -// .tx(tx), -// .rx_data(rx_data), -// .busy_flag(busy_flag), -// .receive_flag(receive_flag), -// .int_req(int_req), -// .access_addr(rs_data), -// .reg_w_en(reg_w_en)); + UART UART(.clk(wb_clk_i), + .reset(reset), + .tx_en(tx_en), + .rx_en(rx_en), + .begin_flag(begin_flag), + .rx(rx), + .tx_data(tx_data), + .tx(tx), + .rx_data(rx_data), + .busy_flag(busy_flag), + .receive_flag(receive_flag), + .int_req(int_req), + .access_addr(rs_data), + .reg_w_en(reg_w_en)); // // LED4 LED4(.in_data(led_in_data), // .begin_flag(led_begin_flag),
diff --git a/verilog/rtl/jacaranda-8/cpu.v b/verilog/rtl/jacaranda-8/cpu.v index 2e7d3f2..f2e128f 100644 --- a/verilog/rtl/jacaranda-8/cpu.v +++ b/verilog/rtl/jacaranda-8/cpu.v
@@ -1,5 +1,6 @@ -module cpu(clock, instr, pc, rd_data, rs_data, mem_w_en, mem_r_data, int_req, int_en, int_vec, reg_w_en); - input clock; +module cpu(raw_clock, reset, instr, pc, rd_data, rs_data, mem_w_en, mem_r_data, int_req, int_en, int_vec, reg_w_en); + input raw_clock; + input reset; input [7:0] instr; //割り込み要求線 input int_req; @@ -36,6 +37,8 @@ //レジスタに書き込むデータをALUからのデータか選択する(1)でALUから(0)でそれ以外 wire reg_alu_w_sel; + wire clock; + assign clock = reset ? 1'b0 : raw_clock; //ALUの制御信号 wire [3:0] alu_ctrl;
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v index 67113ee..c8c2487 100644 --- a/verilog/rtl/uprj_netlists.v +++ b/verilog/rtl/uprj_netlists.v
@@ -25,6 +25,9 @@ `else `include "user_project_wrapper.v" `include "user_proj_example.v" + `include "jacaranda-8/UART/UART.v" + `include "jacaranda-8/UART/rx.v" + `include "jacaranda-8/UART/tx.v" `include "jacaranda-8/alu.v" `include "jacaranda-8/cpu.v" `include "jacaranda-8/decoder.v"