windowsでiverilog その75

#概要　

windowsでiverilogやってみた。
俺cpuのテストベンチ書いてみた。

#ソース

九九

```

mem[12'h000] = 16'h1001;//       push  1
mem[12'h001] = 16'h302f;//       set  a
mem[12'h002] = 16'h1001;//       push  1
mem[12'h003] = 16'h3030;//       set  b
mem[12'h004] = 16'h202f;//label30:  get  a
mem[12'h005] = 16'h2030;//       get  b
mem[12'h006] = 16'hf004;//       *
mem[12'h007] = 16'h3031;//       set  c
mem[12'h008] = 16'h2031;//       get  c
mem[12'h009] = 16'h100a;//       push  10
mem[12'h00a] = 16'hf005;//       /
mem[12'h00b] = 16'h1030;//       push  48
mem[12'h00c] = 16'hf000;//       +
mem[12'h00d] = 16'he000;//       out
mem[12'h00e] = 16'h2031;//       get  c
mem[12'h00f] = 16'h100a;//       push  10
mem[12'h010] = 16'hf006;//       %
mem[12'h011] = 16'h1030;//       push  48
mem[12'h012] = 16'hf000;//       +
mem[12'h013] = 16'he000;//       out
mem[12'h014] = 16'h1020;//       push  32
mem[12'h015] = 16'he000;//       out
mem[12'h016] = 16'h102c;//       push  ','
mem[12'h017] = 16'he000;//       out
mem[12'h018] = 16'h1020;//       push  32
mem[12'h019] = 16'he000;//       out
mem[12'h01a] = 16'h202f;//       get  a
mem[12'h01b] = 16'h1001;//       push  1
mem[12'h01c] = 16'hf000;//       +
mem[12'h01d] = 16'h302f;//       set  a
mem[12'h01e] = 16'h202f;//       get  a
mem[12'h01f] = 16'h100a;//       push  10
mem[12'h020] = 16'hf001;//       <
mem[12'h021] = 16'h5004;//       jz  label30
mem[12'h022] = 16'h100a;//       push  10
mem[12'h023] = 16'he000;//       out
mem[12'h024] = 16'h2030;//       get  b
mem[12'h025] = 16'h1001;//       push  1
mem[12'h026] = 16'hf000;//       +
mem[12'h027] = 16'h3030;//       set  b
mem[12'h028] = 16'h1001;//       push  1
mem[12'h029] = 16'h302f;//       set  a
mem[12'h02a] = 16'h2030;//       get  b
mem[12'h02b] = 16'h100a;//       push  10
mem[12'h02c] = 16'hf001;//       <
mem[12'h02d] = 16'h5004;//       jz  label30
mem[12'h02e] = 16'h402e;//bye:  jmp  bye
mem[12'h02f] = 16'h0000;//a:  0x0000
mem[12'h030] = 16'h0000;//b:  0x0000
mem[12'h031] = 16'h0000;//c:  0x0000

```

#テストベンチ

```
module ore(input clk, input rst, input [15:0] in);
	wire [15:0] in;
	wire [11:0] abus;
	wire [15:0] irout,
		dbus,
		qtop,
		qnext,
		ramout,
		aluout,
		out,
		pcout;
	wire [7:0] data2;
	wire empty;
	wire get;
	wire rdy;
	wire rd;
	wire push;
	wire pop;
	wire pcinc;
	wire dbus2pc;
	wire dbus2ir;
	wire dbus2qtop;
	wire dbus2ram;
	wire dbus2obuf;
	irbuf f(.clk(clk), .rst(rst), .load(dbus2obuf), .d(dbus), .q(data2));
	pcount c(.clk(clk), .rst(rst), .load(abus2pc), .inc(pcinc), .d(abus), .q(pcout));
	irbuf b(.clk(clk), .rst(rst), .load(dbus2ir), .d(dbus), .q(irout));
	stack k(.clk(clk), .rst(rst), .load(dbus2qtop), .push(push), .pop(pop), .d(dbus), .qtop(qtop), .qnext(qnext));
	alu a(.a(qtop), .b(qnext), .f(irout[4:0]), .s(aluout));
	ram r(.clk(clk), .load(dbus2ram), .addr(abus[11:0]), .d(dbus), .q(ramout));
	cpu u(.clk(clk), .rst(rst), .irout(irout), .dbus(dbus), .qtop(qtop), .qnext(qnext), .ramout(ramout),
		.aluout(aluout), .out(out), .pcout(pcout), .in(in), .abus(abus), .pcinc(pcinc), .push(push), .pop(pop),
		.abus2pc(abus2pc), .dbus2ir(dbus2ir), .dbus2qtop(dbus2qtop), .dbus2ram(dbus2ram), .dbus2obuf(dbus2obuf));
	initial
	begin
		$monitor("%s", data2);
	end
endmodule

module test;
	reg clk;
	reg rst;
	reg [7:0] in;
	ore u(.clk(clk), .rst(rst), .in(in));
	initial
	begin
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#4
			rst = 1;
		#11000
			$finish;
	end
	always
		#1
			clk = ~clk;
endmodule




```

#実行結果

```



0
1

,

0
2

,

0
3

,

0
4

,

0
5

,

0
6

,

0
7

,

0
8

,

0
9

,

1
0

,



0
2

,

0
4

,

0
6

,

0
8

,

1
0

,

1
2

,

1
4

,

1
6

,

1
8

,

2
0

,



0
3

,

0
6

,

0
9

,

1
2

,

1
5

,

1
8

,

2
1

,

2
4

,

2
7

,

3
0

,



0
4

,

0
8

,

1
2

,

1
6

,

2
0

,

2
4

,

2
8

,

3
2

,

3
6

,

4
0

,



0
5

,

1
0

,

1
5

,

2
0

,

2
5

,

3
0

,

3
5

,

4
0

,

4
5

,

5
0

,



0
6

,

1
2

,

1
8

,

2
4

,

3
0

,



```

以上。