0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

概要

micropythonでshrike-lite、やってみた。
ルネサスのGo Configure Software Hubは、腐ってる。
400行のverilogで落ちる。

再現手順

top.vを書いて、シンセサイズを押す。
エラーを吐かず、落ちる。
logは、どこ?

投入したtop.v


(* top *) module top ((* iopad_external_pin, clkbuf_inhibit *) input clk,
	(* iopad_external_pin *) output clk_en,
	(* iopad_external_pin *) input rst_n,
	(* iopad_external_pin *) input spi_ss_n,
	(* iopad_external_pin *) input spi_sck,
	(* iopad_external_pin *) input spi_mosi,
	(* iopad_external_pin *) output spi_miso,
	(* iopad_external_pin *) output spi_miso_en
);
	integer i;
	reg [7:0] q [0:5];
	reg [7:0] ram [0:3];
	reg [11:0] rom [0:10];
	reg [6:0] pc;
	reg [6:0] adr;
	reg [7:0] madr;
	reg [7:0] out;
	reg [7:0] tx_data_reg;
	reg stop;
	wire [11:0] code = rom[pc];
	wire [3:0] op = code[11:8];
	wire [7:0] opland = code[7:0];
	wire [7:0] rx_data_wire;
	wire rx_valid_pulse;
	//assign led_en = 1'b1;
	assign clk_en = 1'b1;
	//assign outport = out;
	spi_target #(.CPOL(1'b0), .CPHA(1'b0), .WIDTH(8), .LSB(1'b0)) 
		u_spi_target (.i_clk(clk), .i_rst_n(rst_n), .i_enable(1'b1), .i_ss_n(spi_ss_n), .i_sck(spi_sck), 
		.i_mosi(spi_mosi), .o_miso(spi_miso), .o_miso_oe(spi_miso_en),
		.o_rx_data(rx_data_wire), .o_rx_data_valid(rx_valid_pulse), .i_tx_data(tx_data_reg), .o_tx_data_hold());
	always @(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
		begin
			tx_data_reg <= 8'h00;
		end
		else if (rx_valid_pulse)
		begin
			tx_data_reg <= rx_data_wire;
		end
	end
	always @(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
		begin
			stop <= 1'b0;
		end
		else if (rx_valid_pulse)
		begin
			if (rx_data_wire == 8'hAB)
				stop <= 1'b1;
			else if (rx_data_wire == 8'hFF)
				stop <= 1'b0;
		end
	end	
	always @(posedge clk)
	begin
		if (!rst_n)
		begin
			rom[0]  <= 12'h2_00; 
			
			rom[1]  <= 12'h2_01; 
			
			rom[2]  <= 12'hF_00; 
			rom[3]  <= 12'hF_20; 
			rom[4]  <= 12'h2_65; 
			rom[5]  <= 12'hF_0F; 
			rom[6]  <= 12'h3_3A; 
			rom[7]  <= 12'h4_01; 
			rom[8]  <= 12'hF_20;
			rom[9]  <= 12'h2_0F;
			rom[10] <= 12'hF_04;
			/*
			rom[11] <= 12'h3_25;
			rom[12] <= 12'h4_00;
			rom[13] <= 12'hF_20;
			rom[14] <= 12'h2_03;
			rom[15] <= 12'hF_04;
			rom[16] <= 12'h3_1B;
			rom[17] <= 12'h4_00;
			rom[18] <= 12'hF_20;
			rom[19] <= 12'h2_05;
			rom[20] <= 12'hF_04;
			rom[21] <= 12'h3_2F;
			rom[22] <= 12'h4_00;
			rom[23] <= 12'hF_20;
			rom[24] <= 12'hF_30;
			rom[25] <= 12'h3_37;
			rom[26] <= 12'h4_FF;
			rom[27] <= 12'h2_46;
			rom[28] <= 12'hF_31;
			rom[29] <= 12'h2_69;
			rom[30] <= 12'hF_31;
			rom[31] <= 12'h2_7A;
			rom[32] <= 12'hF_31;
			rom[33] <= 12'h2_7A;
			rom[34] <= 12'hF_31;
			rom[35] <= 12'h3_37;
			rom[36] <= 12'h4_FF;
			rom[37] <= 12'h2_46;
			rom[38] <= 12'hF_31;
			rom[39] <= 12'h2_69;
			rom[40] <= 12'hF_31;
			rom[41] <= 12'h2_7A;
			rom[42] <= 12'hF_31;
			rom[43] <= 12'h2_7A;
			rom[44] <= 12'hF_31;
			rom[45] <= 12'h3_2F;
			rom[46] <= 12'h4_FF;
			rom[47] <= 12'h2_42;
			rom[48] <= 12'hF_31;
			rom[49] <= 12'h2_75;
			rom[50] <= 12'hF_31;
			rom[51] <= 12'h2_7A;
			rom[52] <= 12'hF_31;
			rom[53] <= 12'h2_7A;
			rom[54] <= 12'hF_31;
			rom[55] <= 12'hF_32;
			rom[56] <= 12'h3_01;
			rom[57] <= 12'h4_FF;
			rom[58] <= 12'hF_21;
			rom[59] <= 12'h0_00;
			*/
			for (i = 0; i < 6; i = i + 1)
				q[i] <= 8'd0;
			for (i = 0; i < 3; i = i + 1)
				ram[i] <= 8'd0;
			adr <= 0;
			out <= 0;
			pc <= 0;
		end
		else
		begin
			case (op)
			4'h0:
				pc <= pc;
			4'h2:
			begin
				q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
				q[0] <= opland;
				pc <= pc + 1;
			end
			4'h3:
			begin
				adr <= opland[5:0];
				pc <= pc + 1;
			end
			
			4'h4:
			begin
				case (opland)
				8'h00:
				begin
					if (q[0] == 8'd0)
						pc <= adr;
					else
						pc <= pc + 1;
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h01:
				begin
					if (q[0] == 8'd1)
						pc <= adr;
					else
						pc <= pc + 1;
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'hFF:
				begin
					pc <= adr;
				end
				default:
					pc <= pc + 1;
				endcase
			end
			4'h5:
			begin
				out <= q[0];
				q[0] <= q[1]; 
				q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				pc <= pc + 1;
			end
			4'h6:
			begin 
				case (opland)
				8'h00:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
					q[0] <= ram[q[0]];
					pc <= pc + 1;
				end
				8'h01:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
					q[0] <= ram[madr];
					pc <= pc + 1;
				end
				default:
					pc <= pc + 1;
				endcase
			end
			4'h7:
			begin 
				case (opland)
				8'h00:
				begin
					ram[q[0]] <= q[0];
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
					pc <= pc + 1;
				end
				8'h01:
				begin
					ram[madr] <= q[0];
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
					pc <= pc + 1;
				end
				default:
					pc <= pc + 1;
				endcase
			end
			4'h8:
			begin
				q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
				q[0] <= q[0];
				pc <= pc + 1;
			end
			4'h9:
			begin
				q[0] <= q[1]; 
				q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				pc <= pc + 1;
			end
			4'hA:
			begin
				madr <= opland;
				pc <= pc + 1;
			end
			4'hF:
			begin
				case (opland)
				8'h00:
				begin
					q[0] <= q[1] + q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h01:
				begin
					q[0] <= q[1] - q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h02:
				begin
					q[0] <= q[1] * q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h03:
				begin
					q[0] <= (q[0] != 0) ? q[1] / q[0] : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h04:
				begin
					q[0] <= (q[0] != 0) ? q[1] % q[0] : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h0F: // =
				begin
					q[0] <= (q[1] == q[0]) ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h10:
				begin
					q[0] <= (q[1] < q[0])  ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h11:
				begin
					q[0] <= (q[1] > q[0])  ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h12:
				begin
					q[0] <= (q[0] > q[1]) ? q[0] : q[1];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h13:
				begin
					q[0] <= (q[0] < q[1]) ? q[0] : q[1];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h14:
				begin
					q[0] <= q[1] & q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h15:
				begin
					q[0] <= q[1] | q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h16:
				begin
					q[0] <= ~q[0];
				end
				8'h20:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0]; 
					q[0] <= q[0];
				end
				8'h21:
				begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h22:
				begin
					q[0] <= q[1];
					q[1] <= q[0];
				end
				8'h23:
				begin
					q[5] <= q[4]; 
					q[4] <= q[3]; 
					q[3] <= q[2]; 
					q[2] <= q[1];
					q[1] <= q[0];
					q[0] <= q[1];
				end
				8'h24:
				begin
					q[0] <= q[2];
					q[1] <= q[0];
					q[2] <= q[1];
				end
				8'h25:
				begin
					q[5] <= q[4]; 
					q[4] <= q[3]; 
					q[3] <= q[2];
					q[2] <= q[1];
					q[1] <= q[0];
					q[0] <= q[0];
				end
				8'h26:
				begin
					q[5] <= q[3]; 
					q[4] <= q[2];
					q[3] <= q[1];
					q[2] <= q[0];
					q[1] <= q[1];
					q[0] <= q[0];
				end
				8'h52:
				begin
					q[0] <= ram[q[0] + 8'd1];
				end
				8'h60:
				begin
					q[0] <= q[0] - 8'd1;
					if (q[0] != 8'd1) 
					begin
						pc <= adr - 6'd1;
					end
				end
				8'h30:
				begin
					$write("%d ", q[0]);
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h31:
				begin
					$write("%c", q[0]);
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h32:
				begin
					$display("");
				end
				8'h33:
				begin
					$write(" ");
				end
				default: ;
				endcase
				if (opland != 8'h60 || q[0] == 8'd1) 
				begin
					pc <= pc + 1;
				end
			end
			default:
				pc <= pc + 1;
			endcase
		end
	end
endmodule




削って落ちないコード

300行

(* top *) module top ((* iopad_external_pin, clkbuf_inhibit *) input clk,
	(* iopad_external_pin *) output clk_en,
	(* iopad_external_pin *) input rst_n,
	(* iopad_external_pin *) input spi_ss_n,
	(* iopad_external_pin *) input spi_sck,
	(* iopad_external_pin *) input spi_mosi,
	(* iopad_external_pin *) output spi_miso,
	(* iopad_external_pin *) output spi_miso_en
);
	integer i;
	reg [7:0] q [0:5];
	reg [6:0] pc;
	reg [6:0] adr;
	reg [7:0] madr;
	reg [7:0] out;
	reg [7:0] tx_data_reg;
	reg stop;
	wire [11:0] code; //= rom[pc];
	wire [3:0] op = code[11:8];
	wire [7:0] opland = code[7:0];
	wire [7:0] rx_data_wire;
	wire rx_valid_pulse;

	assign clk_en = 1'b1;

	spi_target #(.CPOL(1'b0), .CPHA(1'b0), .WIDTH(8), .LSB(1'b0)) 
		u_spi_target (.i_clk(clk), .i_rst_n(rst_n), .i_enable(1'b1), .i_ss_n(spi_ss_n), .i_sck(spi_sck), 
		.i_mosi(spi_mosi), .o_miso(spi_miso), .o_miso_oe(spi_miso_en),
		.o_rx_data(rx_data_wire), .o_rx_data_valid(rx_valid_pulse), .i_tx_data(tx_data_reg), .o_tx_data_hold());

	always @(posedge clk or negedge rst_n)
	begin
		if (!rst_n) begin
			tx_data_reg <= 8'h00;
		end
		else if (rx_valid_pulse) begin
			tx_data_reg <= rx_data_wire;
		end
	end

	always @(posedge clk or negedge rst_n)
	begin
		if (!rst_n) begin
			stop <= 1'b0;
		end
		else if (rx_valid_pulse) begin
			if (rx_data_wire == 8'hAB)
				stop <= 1'b1;
			else if (rx_data_wire == 8'hFF)
				stop <= 1'b0;
		end
	end	

	// 感度リストに or negedge rst_n を追加し、リセット動作の整合性を確保
	always @(posedge clk or negedge rst_n)
	begin
		if (!rst_n)
		begin
			// integerを使用したループ初期化
			for (i = 0; i < 6; i = i + 1)
				q[i] <= 8'd0;
			adr <= 0;
			out <= 0;
			pc <= 0;
			madr <= 0;
		end
		else
		begin
			case (op)
			4'h0:
				pc <= pc;
			4'h2:
			begin
				q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
				q[0] <= opland;
				pc <= pc + 1;
			end
			4'h3:
			begin
				adr <= opland[5:0];
				pc <= pc + 1;
			end
			
			4'h4:
			begin
				case (opland)
				8'h00:
				begin
					if (q[0] == 8'd0)
						pc <= adr;
					else
						pc <= pc + 1;
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h01:
				begin
					if (q[0] == 8'd1)
						pc <= adr;
					else
						pc <= pc + 1;
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'hFF:
				begin
					pc <= adr;
				end
				default:
					pc <= pc + 1;
				endcase
			end
			4'h5:
			begin
				out <= q[0];
				q[0] <= q[1]; 
				q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				pc <= pc + 1;
			end
			4'h6:
			begin 
				case (opland)
				8'h00: pc <= pc + 1;
				8'h01: pc <= pc + 1;
				default: pc <= pc + 1;
				endcase
			end
			4'h7:
			begin 
				case (opland)
				8'h00:
				begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
					pc <= pc + 1;
				end
				8'h01:
				begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
					pc <= pc + 1;
				end
				default:
					pc <= pc + 1;
				endcase
			end
			4'h8:
			begin
				q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
				q[0] <= q[0];
				pc <= pc + 1;
			end
			4'h9:
			begin
				q[0] <= q[1]; 
				q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				pc <= pc + 1;
			end
			4'hA:
			begin
				madr <= opland;
				pc <= pc + 1;
			end
			4'hF:
			begin
				case (opland)
				8'h00:
				begin
					q[0] <= q[1] + q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h01:
				begin
					q[0] <= q[1] - q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h02:
				begin
					q[0] <= q[1] * q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h03: // GreenPAKの規模では除算は論理合成エラーやフリーズの原因になりやすいです
				begin
					q[0] <= (q[0] != 0) ? q[1] / q[0] : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h04: // 剰余も同様に莫大なリソースを消費します
				begin
					q[0] <= (q[0] != 0) ? q[1] % q[0] : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h0F: // =
				begin
					q[0] <= (q[1] == q[0]) ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h10:
				begin
					q[0] <= (q[1] < q[0])  ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h11:
				begin
					q[0] <= (q[1] > q[0])  ? 8'd1 : 8'd0;
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h12:
				begin
					q[0] <= (q[0] > q[1]) ? q[0] : q[1];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h13:
				begin
					q[0] <= (q[1] < q[0]) ? q[1] : q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h14:
				begin
					q[0] <= q[1] & q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h15:
				begin
					q[0] <= q[1] | q[0];
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h16:
				begin
					q[0] <= ~q[0];
				end
				8'h20:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0]; 
					q[0] <= q[0];
				end
				8'h21:
				begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h22:
				begin
					q[0] <= q[1];
					q[1] <= q[0];
				end
				8'h23:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
					q[0] <= q[1];
				end
				8'h24:
				begin
					q[0] <= q[2];
					q[1] <= q[0];
					q[2] <= q[1];
				end
				8'h25:
				begin
					q[5] <= q[4]; q[4] <= q[3]; q[3] <= q[2]; q[2] <= q[1]; q[1] <= q[0];
					q[0] <= q[0];
				end
				8'h26:
				begin
					q[5] <= q[3]; q[4] <= q[2]; q[3] <= q[1]; q[2] <= q[0];
					q[1] <= q[1]; q[0] <= q[0];
				end
				8'h52: ;
				8'h60:
				begin
					q[0] <= q[0] - 8'd1;
					if (q[0] != 8'd1) 
					begin
						pc <= adr - 6'd1;
					end
				end
				// シミュレーション専用タスク($write, $display)をすべて削除(または空に変更)
				8'h30: begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h31: begin
					q[0] <= q[1]; 
					q[1] <= q[2]; q[2] <= q[3]; q[3] <= q[4]; q[4] <= q[5]; q[5] <= 8'd0;
				end
				8'h32: ;
				8'h33: ;
				default: ;
				endcase
				if (opland != 8'h60 || q[0] == 8'd1) 
				begin
					pc <= pc + 1;
				end
			end
			default:
				pc <= pc + 1;
			endcase
		end
	end
endmodule

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?