MIPS CPU
設計描述:
此次作業目的是設計一個CPU執行簡單運算並使用pipeline,可以連續執行序列 的Instruction。
MIPS是一種指令集,內含有許多指令,此次作業以MIPS指令集做稍微修改。
指令表:

ERROR條件:
當遇到以下情況時會發生instruction fail:
(1) Opcode不在列表中
(2) R type指令的Funct不在列表中
(3) R type指令的Rs, Rt, Rd不存在暫存器的Address列表中 (雖然shift指令沒有使用到Rs,但是仍要檢查)
(4) I type指令的Rs, Rt不存在暫存器的Address列表中
(5) 在進行最大公因數的計算時,若Rs, Rt的value任一個為0,無法計算當instruction fail發生時,out_1、out_2、out_3、out_4皆須設置為零,並且將intruction_fail 設為1。
其他資料:
除了Instruction外,還有兩個input : in_valid、output_reg
in_valid為high時代表instruction與output_reg開始給值,design要開始取值。
output_reg代表最後output的四個signal需要取的是哪四個暫存器,給的值是address, 並且分別將暫存器的value給out_1、out_2、out_3、out_4,如下表所示。

暫存器:
六個暫存器的address分別是10001、10010、01000、10111、11111、10000。
IO:

主程式:- module MIPS(
- //Input
- clk,
- rst_n,
- in_valid,
- instruction,
- output_reg,
- //OUTPUT
- out_valid,
- out_1,
- out_2,
- out_3,
- out_4,
- instruction_fail
- );
- //Input
- input clk;
- input rst_n;
- input in_valid;
- input [31:0] instruction;
- input [19:0] output_reg;
- //OUTPUT
- output logic out_valid, instruction_fail;
- output logic [15:0] out_1, out_2, out_3, out_4;
- //reg and state
- logic [31:0] ins_reg;
- logic [19:0] outsignal_reg;
- logic [15:0] reg_five[0:5];//address are 10001, 10010, 01000, 10111, 11111, 10000
- logic [3:0] address1, address2, address3; //short address for rs rt rd
- logic [3:0] state, next;
- logic [15:0] gcd_1, gcd_2;
- //flag
- logic check;
- parameter S_default = 0,
- S_plus = 1,
- S_and = 2,
- S_or = 3,
- S_nor = 4,
- S_leftshift = 5,
- S_rightshift= 6,
- S_gcd1 = 7,
- S_gcd2 = 8,
- S_imm = 9,
- S_out = 10,
- S_error = 11;
- always@(posedge clk or negedge rst_n) begin //state & input & output
- if (!rst_n) begin
- out_valid <= 0;
- out_1 <= 0;
- out_2 <= 0;
- out_3 <= 0;
- out_4 <= 0;
- instruction_fail <= 0;
- state <= S_default;
- ins_reg <= 0;
- address1 <= 0;
- address2 <= 0;
- address3 <= 0;
- reg_five[0] <= 0;
- reg_five[1] <= 0;
- reg_five[2] <= 0;
- reg_five[3] <= 0;
- reg_five[4] <= 0;
- reg_five[5] <= 0;
- gcd_1 <= 0;
- gcd_2 <= 0;
- end
- else begin
- state <= next;
- case(state)
- S_default: begin
- out_valid <= 0;
- out_1 <= 0;
- out_2 <= 0;
- out_3 <= 0;
- out_4 <= 0;
- instruction_fail <= 0;
- gcd_1 <= 0;
- gcd_2 <= 0;
- if(in_valid) begin
- ins_reg <= instruction;
- outsignal_reg <= output_reg;
- if(instruction[31:26]==0 && !check) begin //R-type
- case(instruction[25:21]) //rs
- 17: address1 <= 0;
- 18: address1 <= 1;
- 8 : address1 <= 2;
- 23: address1 <= 3;
- 31: address1 <= 4;
- 16: address1 <= 5;
- default: address1 <= 0;
- endcase
- case(instruction[20:16]) //rt
- 17: address2 <= 0;
- 18: address2 <= 1;
- 8 : address2 <= 2;
- 23: address2 <= 3;
- 31: address2 <= 4;
- 16: address2 <= 5;
- default: address2 <= 0;
- endcase
- case(instruction[15:11]) //rd
- 17: address3 <= 0;
- 18: address3 <= 1;
- 8 : address3 <= 2;
- 23: address3 <= 3;
- 31: address3 <= 4;
- 16: address3 <= 5;
- default: address3 <= 0;
- endcase
- end
- else if(instruction[31:26]==8 && !check) begin //T-type
- case(instruction[25:21]) //rs
- 17: address1 <= 0;
- 18: address1 <= 1;
- 8 : address1 <= 2;
- 23: address1 <= 3;
- 31: address1 <= 4;
- 16: address1 <= 5;
- default: address1 <= 0;
- endcase
- case(instruction[20:16]) //rt
- 17: address2 <= 0;
- 18: address2 <= 1;
- 8 : address2 <= 2;
- 23: address2 <= 3;
- 31: address2 <= 4;
- 16: address2 <= 5;
- default: address2 <= 0;
- endcase
- end
- else begin
- out_valid <= 0;
- out_1 <= 0;
- out_2 <= 0;
- out_3 <= 0;
- out_4 <= 0;
- instruction_fail <= 0;
- ins_reg <= 0;
- address1 <= 0;
- address2 <= 0;
- address3 <= 0;
- end
- end
- end
- S_plus: begin
- reg_five[address3] <= (reg_five[address1] + reg_five[address2]);
- end
- S_and: begin
- reg_five[address3] <= (reg_five[address1] & reg_five[address2]);
- end
- S_or: begin
- reg_five[address3] <= (reg_five[address1] | reg_five[address2]);
- end
- S_nor: begin
- reg_five[address3] <= ~(reg_five[address1] | reg_five[address2]);
- end
- S_leftshift: begin
- reg_five[address3] <= (reg_five[address2] << ins_reg[10:7]);
- end
- S_rightshift: begin
- reg_five[address3] <= (reg_five[address2] >> ins_reg[10:7]);
- end
- S_gcd1: begin
- gcd_1 <= reg_five[address1];
- gcd_2 <= reg_five[address2];
- end
- S_gcd2: begin
- if(gcd_1>gcd_2) begin
- if(gcd_2>4095) gcd_1 <= gcd_1 - gcd_2;
- else gcd_1 <= gcd_1 % gcd_2;
- end
- else begin
- if(gcd_1>4095) gcd_2 <= gcd_2 - gcd_1;
- else gcd_2 <= gcd_2 % gcd_1;
- end
- if(!gcd_1) reg_five[address3] <= gcd_2;
- if(!gcd_2) reg_five[address3] <= gcd_1;
- end
- S_imm: begin
- reg_five[address2] <= (reg_five[address1] + ins_reg[15:0]);
- end
- S_out: begin
- out_valid <= 1;
- case(outsignal_reg[4:0])
- 17: out_1 <= reg_five[0];
- 18: out_1 <= reg_five[1];
- 8: out_1 <= reg_five[2];
- 23: out_1 <= reg_five[3];
- 31: out_1 <= reg_five[4];
- 16: out_1 <= reg_five[5];
- default: out_1 <= 0;
- endcase
- case(outsignal_reg[9:5])
- 17: out_2 <= reg_five[0];
- 18: out_2 <= reg_five[1];
- 8: out_2 <= reg_five[2];
- 23: out_2 <= reg_five[3];
- 31: out_2 <= reg_five[4];
- 16: out_2 <= reg_five[5];
- default: out_2 <= 0;
- endcase
- case(outsignal_reg[14:10])
- 17: out_3 <= reg_five[0];
- 18: out_3 <= reg_five[1];
- 8: out_3 <= reg_five[2];
- 23: out_3 <= reg_five[3];
- 31: out_3 <= reg_five[4];
- 16: out_3 <= reg_five[5];
- default: out_3 <= 0;
- endcase
- case(outsignal_reg[19:15])
- 17: out_4 <= reg_five[0];
- 18: out_4 <= reg_five[1];
- 8: out_4 <= reg_five[2];
- 23: out_4 <= reg_five[3];
- 31: out_4 <= reg_five[4];
- 16: out_4 <= reg_five[5];
- default: out_4 <= 0;
- endcase
- end
- S_error: begin
- out_valid <= 1;
- instruction_fail <= 1;
- end
- endcase
- end
- end
- always@(*) begin //next state
- check = 0;
- case(state)
- S_default: begin
- if(in_valid) begin
- if(instruction[15:11]!=17 && instruction[15:11]!=18 && instruction[15:11]!=8 && instruction[15:11]!=23 && instruction[15:11]!=31 && instruction[15:11]!=16 && instruction[31:26]==0) check = 1; //check rd
- if(instruction[25:21]!=17 && instruction[25:21]!=18 && instruction[25:21]!=8 && instruction[25:21]!=23 && instruction[25:21]!=31 && instruction[25:21]!=16) check = 1; //check rs
- if(instruction[20:16]!=17 && instruction[20:16]!=18 && instruction[20:16]!=8 && instruction[20:16]!=23 && instruction[20:16]!=31 && instruction[20:16]!=16) check = 1; //check rt
- if(instruction[31:26]==0 && !check) begin //R-type
- case(instruction[6:0])
- 32: next = S_plus;
- 36: next = S_and;
- 37: next = S_or;
- 39: next = S_nor;
- 0: next = S_leftshift;
- 2: next = S_rightshift;
- 120: begin
- next = S_gcd1;
- end
- default: next = S_error;
- endcase
- end
- else if(instruction[31:26]==8 && !check) next = S_imm; //T-type
- else next = S_error;
- end
- else next = S_default;
- end
- S_gcd1: begin
- if(reg_five[address1]==0 || reg_five[address2]==0) next = S_error;
- else next = S_gcd2;
- end
- S_gcd2: begin
- if(gcd_1==0 || gcd_2==0) next = S_out;
- else next = S_gcd2;
- end
- S_out: begin
- next = S_default;
- end
- S_error: begin
- next = S_default;
- end
- default: next = S_out;
- endcase
- end
- endmodule
複製代碼 pattern:- `timescale 1ns/10ps
- module PATTERN(
- //output logic
- clk,
- rst_n,
- in_valid,
- instruction,
- output_reg,
- //OUTPUT
- out_valid,
- out_1,
- out_2,
- out_3,
- out_4,
- instruction_fail
- );
- //Input
- input out_valid, instruction_fail;
- input [15:0] out_1, out_2, out_3, out_4;
- //Output
- output logic clk;
- output logic rst_n;
- output logic in_valid;
- output logic [31:0] instruction;
- output logic [19:0] output_reg;
- //================================================================
- // parameters & integer
- //================================================================
- integer CYCLE = 10;
- integer PATNUM = 1000;
- integer patcount;
- logic [5:0] opcode;
- logic [4:0] rs, rt, rd;
- logic [3:0] shamt;
- logic [6:0] funct;
- logic [15:0] imm;
- logic [4:0] outsignal_reg[4];
- logic [15:0] reg_five[0:5];//address are 10001, 10010, 01000, 10111, 11111, 10000
- logic [3:0] address1, address2, address3; //short address for rs rt rd
- logic [15:0] gcd_1, gcd_2;
- logic [3:0] random;
- logic [15:0] gout_1, gout_2, gout_3, gout_4;
- logic flag_error;
- always #(CYCLE/2.0) clk = ~clk;
- //================================================================
- // initial
- //================================================================
- initial begin
- rst_n = 1'b1;
- in_valid = 0;
- force clk = 0;
- reset_task;
- repeat(5)@(negedge clk);
- for(int j=0;j<6;j=j+1) reg_five[j] = 0;
- for(patcount=0; patcount<PATNUM; patcount=patcount+1) begin
- input_gen_ans_task;
- for(int i=0;i<1001;i=i+1) begin
- repeat(1)@(negedge clk);
- if(out_valid===1) begin
- check_ans;
- break;
- end
- if(i===100) latency_task;
- end
- outvalid_zero;
- output_zero;
- end
- YOU_PASS_task;
- $finish;
- end
- //================================================================
- // task
- //================================================================
- task input_gen_ans_task; begin
- in_valid = 1;
- flag_error = 0;
- funct = 0;
- imm = 0;
- shamt = 0;
- //for opcode
- random = $urandom_range(0,2);
- case(random)
- 0: opcode = 6'b000000; //type R
- 1: opcode = 6'b001000; //type I
- 2: begin
- opcode = 6'b000001; //error
- flag_error = 1;
- end
- endcase
- //for Rs
- random = $urandom_range(0,6);
- address1 = random;
- case(random)
- 0: rs = 5'b10001;
- 1: rs = 5'b10010;
- 2: rs = 5'b01000;
- 3: rs = 5'b10111;
- 4: rs = 5'b11111;
- 5: rs = 5'b10000;
- 6: begin
- rs = 5'b10101; //error
- flag_error = 1;
- end
- endcase
- //for Rt
- random = $urandom_range(0,6);
- address2 = random;
- case(random)
- 0: rt = 5'b10001;
- 1: rt = 5'b10010;
- 2: rt = 5'b01000;
- 3: rt = 5'b10111;
- 4: rt = 5'b11111;
- 5: rt = 5'b10000;
- 6: begin
- rt = 5'b10101; //error
- flag_error = 1;
- end
- endcase
-
- if(!opcode) begin //type R
- //for Rd
- random = $urandom_range(0,6);
- address3 = random;
- case(random)
- 0: rd = 5'b10001;
- 1: rd = 5'b10010;
- 2: rd = 5'b01000;
- 3: rd = 5'b10111;
- 4: rd = 5'b11111;
- 5: rd = 5'b10000;
- 6: begin
- rd = 5'b10101; //error
- flag_error = 1;
- end
- endcase
- //for shamt
- shamt = $urandom_range(0,15);
- //for funct
- random = $urandom_range(0,7);
- case(random)
- 0: funct = 7'b0100000;
- 1: funct = 7'b0100100;
- 2: funct = 7'b0100101;
- 3: funct = 7'b0100111;
- 4: funct = 7'b0000000;
- 5: funct = 7'b0000010;
- 6: funct = 7'b1111000;
- 7: begin
- funct = 7'b1100110; //error
- flag_error = 1;
- end
- endcase
- if(!flag_error) begin
- case(random)
- 0: reg_five[address3] = reg_five[address1] + reg_five[address2];
- 1: reg_five[address3] = reg_five[address1] & reg_five[address2];
- 2: reg_five[address3] = reg_five[address1] | reg_five[address2];
- 3: reg_five[address3] = ~(reg_five[address1] | reg_five[address2]);
- 4: reg_five[address3] = reg_five[address2]<<shamt;
- 5: reg_five[address3] = reg_five[address2]>>shamt;
- 6: begin
- if(reg_five[address1]===0 || reg_five[address2]===0) flag_error = 1;
- else begin
- gcd_1 = reg_five[address1];
- gcd_2 = reg_five[address2];
- end
- while(gcd_1!=0 && gcd_2!=0) begin
- if(gcd_1>gcd_2) gcd_1 = gcd_1 % gcd_2;
- else gcd_2 = gcd_2 % gcd_1;
- if(!gcd_1) reg_five[address3] = gcd_2;
- if(!gcd_2) reg_five[address3] = gcd_1;
- end
- end
- endcase
- end
- end
- //for imm
- imm = $urandom_range(0,63);
- if(!flag_error && opcode==8) reg_five[address2] = reg_five[address1] + imm;
- //for output_reg
- random = $urandom_range(0,5);
- case(random)
- 0: outsignal_reg[0] = 5'b10001;
- 1: outsignal_reg[0] = 5'b10010;
- 2: outsignal_reg[0] = 5'b01000;
- 3: outsignal_reg[0] = 5'b10111;
- 4: outsignal_reg[0] = 5'b11111;
- 5: outsignal_reg[0] = 5'b10000;
- endcase
- random = $urandom_range(0,5);
- case(random)
- 0: outsignal_reg[1] = 5'b10001;
- 1: outsignal_reg[1] = 5'b10010;
- 2: outsignal_reg[1] = 5'b01000;
- 3: outsignal_reg[1] = 5'b10111;
- 4: outsignal_reg[1] = 5'b11111;
- 5: outsignal_reg[1] = 5'b10000;
- endcase
- random = $urandom_range(0,5);
- case(random)
- 0: outsignal_reg[2] = 5'b10001;
- 1: outsignal_reg[2] = 5'b10010;
- 2: outsignal_reg[2] = 5'b01000;
- 3: outsignal_reg[2] = 5'b10111;
- 4: outsignal_reg[2] = 5'b11111;
- 5: outsignal_reg[2] = 5'b10000;
- endcase
- random = $urandom_range(0,5);
- case(random)
- 0: outsignal_reg[3] = 5'b10001;
- 1: outsignal_reg[3] = 5'b10010;
- 2: outsignal_reg[3] = 5'b01000;
- 3: outsignal_reg[3] = 5'b10111;
- 4: outsignal_reg[3] = 5'b11111;
- 5: outsignal_reg[3] = 5'b10000;
- endcase
- //output
- if(!opcode) begin
- instruction[31:26] = opcode;
- instruction[25:21] = rs;
- instruction[20:16] = rt;
- instruction[15:11] = rd;
- instruction[10:7] = shamt;
- instruction[6:0] = funct;
- end
- else begin
- instruction[31:26] = opcode;
- instruction[25:21] = rs;
- instruction[20:16] = rt;
- instruction[15:0] = imm;
- end
- output_reg[4:0] = outsignal_reg[0];
- output_reg[9:5] = outsignal_reg[1];
- output_reg[14:10] = outsignal_reg[2];
- output_reg[19:15] = outsignal_reg[3];
- if(flag_error) begin
- gout_1 = 0;
- gout_2 = 0;
- gout_3 = 0;
- gout_4 = 0;
- end
- else begin
- case(outsignal_reg[0])
- 17: gout_1 = reg_five[0];
- 18: gout_1 = reg_five[1];
- 8: gout_1 = reg_five[2];
- 23: gout_1 = reg_five[3];
- 31: gout_1 = reg_five[4];
- 16: gout_1 = reg_five[5];
- endcase
- case(outsignal_reg[1])
- 17: gout_2 = reg_five[0];
- 18: gout_2 = reg_five[1];
- 8: gout_2 = reg_five[2];
- 23: gout_2 = reg_five[3];
- 31: gout_2 = reg_five[4];
- 16: gout_2 = reg_five[5];
- endcase
- case(outsignal_reg[2])
- 17: gout_3 = reg_five[0];
- 18: gout_3 = reg_five[1];
- 8: gout_3 = reg_five[2];
- 23: gout_3 = reg_five[3];
- 31: gout_3 = reg_five[4];
- 16: gout_3 = reg_five[5];
- endcase
- case(outsignal_reg[3])
- 17: gout_4 = reg_five[0];
- 18: gout_4 = reg_five[1];
- 8: gout_4 = reg_five[2];
- 23: gout_4 = reg_five[3];
- 31: gout_4 = reg_five[4];
- 16: gout_4 = reg_five[5];
- endcase
- end
- repeat(1)@(negedge clk);
- in_valid = 0;
- end endtask
- task reset_task; begin
- #(0.5); rst_n = 0;
- #(3.0);
- if(out_valid !== 0 || out_1 !== 0 || out_2 !== 0 || out_3 !== 0 || out_4 !== 0 || instruction_fail !== 0) begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC1! ");
- $display (" Reset ");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end
- #(3) rst_n = 1;
- #(3) release clk;
- end endtask
- task outvalid_zero; begin
- repeat(1)@(negedge clk);
- if(out_valid !== 0) begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC2! ");
- $display (" Outvalid should be zero after check ");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end
-
- end endtask
- task input_output_high; begin
- if(out_valid === 1) begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC3! ");
- $display (" Outvalid should not be overlapped with invalid ");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end
- end endtask
- task latency_task; begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC4! ");
- $display (" The execution latency are over 100 cycles ");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end endtask
- task check_ans; begin
- if(instruction_fail!=flag_error || out_1!=gout_1 || out_2!=gout_2|| out_3!=gout_3 || out_4!=gout_4) begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC5! ");
- $display (" Pattern No.%d ",patcount);
- $display (" instruction_fail:%d golden answer:%d ",instruction_fail, flag_error);
- $display (" out_1:%d golden answer:%d ",out_1, gout_1);
- $display (" out_2:%d golden answer:%d ",out_2, gout_2);
- $display (" out_3:%d golden answer:%d ",out_3, gout_3);
- $display (" out_4:%d golden answer:%d ",out_4, gout_4);
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end
- repeat(1)@(negedge clk);
- end endtask
- task output_zero; begin
- if(out_1 !== 0 || out_2 !== 0 || out_3 !== 0 || out_4 !== 0 || instruction_fail !== 0) begin
- fail;
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" SPEC6! ");
- $display (" Output should be zero when outvalid is zero ");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end
- end endtask
- task YOU_PASS_task;begin
- $display("\033[37m ");
- $display("\033[37m \033[32m :BBQvi. ");
- $display("\033[37m .i7ssrvs7 \033[32m BBBBBBBBQi ");
- $display("\033[37m .:r7rrrr:::. .::::::... .i7vr:. .B: \033[32m :BBBP :7BBBB. ");
- $display("\033[37m .Kv.........:rrvYr7v7rr:.....:rrirJr. .rgBBBBg Bi \033[32m BBBB BBBB ");
- $display("\033[37m 7Q :rubEPUri:. ..:irrii:.. :bBBBBBBBBBBB B \033[32m iBBBv BBBB vBr ");
- $display("\033[37m 7B BBBBBBBBBBBBBBB::BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB :R \033[32m BBBBBKrirBBBB. :BBBBBB: ");
- $display("\033[37m Jd .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: Bi \033[32m rBBBBBBBBBBBR. .BBBM:BBB ");
- $display("\033[37m uZ .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB .B \033[32m BBBB .::. EBBBi :BBU ");
- $display("\033[37m 7B .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB B \033[32m MBBBr vBBBu BBB. ");
- $display("\033[37m .B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: JJ \033[32m i7PB iBBBBB. iBBB ");
- $display("\033[37m B. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB Lu \033[32m vBBBBPBBBBPBBB7 .7QBB5i ");
- $display("\033[37m Y1 KBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBi XBBBBBBBi :B \033[32m :RBBB. .rBBBBB. rBBBBBBBB7 ");
- $display("\033[37m :B .BBBBBBBBBBBBBsRBBBBBBBBBBBrQBBBBB. UBBBRrBBBBBBr 1BBBBBBBBB B. \033[32m . BBBB BBBB :BBBB ");
- $display("\033[37m Bi BBBBBBBBBBBBBi :BBBBBBBBBBE .BBK. . . QBBBBBBBBBBBBBBBBBB Bi \033[32m rBBBr BBBB BBBU ");
- $display("\033[37m .B .BBBBBBBBBBBBBBQBBBBBBBBBBBB \033[38;2;242;172;172mBBv \033[37m.LBBBBBBBBBBBBBBBBBBBBBB. B7.:ii: \033[32m vBBB .BBBB :7i. ");
- $display("\033[37m .B PBBBBBBBBBBBBBBBBBBBBBBBBBBBBbYQB. \033[38;2;242;172;172mBB: \033[37mBBBBBBBBBBBBBBBBBBBBBBBBB Jr:::rK7 \033[32m .7 BBB7 iBBBg ");
- $display("\033[37m 7M PBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mBB. \033[37mBBBBBBBBBBBBBBBBBBBBBBB..i . v1 \033[32mdBBB. 5BBBr ");
- $display("\033[37m sZ .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mBB. \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBB iD2BBQL. \033[32m ZBBBr EBBBv YBBBBQi ");
- $display("\033[37m .7YYUSIX5 .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mBB. \033[37mBBBBBBBBBBBBBBBBBBBBBBBBY.:. :B \033[32m iBBBBBBBBD BBBBBBBBB. ");
- $display("\033[37m LB. ..BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB. \033[38;2;242;172;172mBB: \033[37mBBBBBBBBBBBBBBBBBBBBBBBBMBBB. BP17si \033[32m :LBBBr vBBBi 5BBB ");
- $display("\033[37m KvJPBBB :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: \033[38;2;242;172;172mZB: \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBsiJr .i7ssr: \033[32m ... :BBB: BBBu ");
- $display("\033[37m i7ii:. ::BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBj \033[38;2;242;172;172muBi \033[37mQBBBBBBBBBBBBBBBBBBBBBBBBi.ir iB \033[32m .BBBi BBBB iMBu ");
- $display("\033[37mDB . vBdBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBg \033[38;2;242;172;172m7Bi \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBBBB rBrXPv. \033[32m BBBX :BBBr ");
- $display("\033[37m :vQBBB. BQBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBQ \033[38;2;242;172;172miB: \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBBBB .L:ii::irrrrrrrr7jIr \033[32m .BBBv :BBBQ ");
- $display("\033[37m :7:. .. 5BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mBr \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBBB: ..... ..YB. \033[32m .BBBBBBBBB: ");
- $display("\033[37mBU .:. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mB7 \033[37mgBBBBBBBBBBBBBBBBBBBBBBBBBB. gBBBBBBBBBBBBBBBBBB. BL \033[32m rBBBBB1. ");
- $display("\033[37m rY7iB: BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: \033[38;2;242;172;172mB7 \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBB. QBBBBBBBBBBBBBBBBBi v5 ");
- $display("\033[37m us EBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \033[38;2;242;172;172mIr \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBgu7i.:BBBBBBBr Bu ");
- $display("\033[37m B 7BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.\033[38;2;242;172;172m:i \033[37mBBBBBBBBBBBBBBBBBBBBBBBBBBBv:. .. ::: .rr rB ");
- $display("\033[37m us .BBBBBBBBBBBBBQLXBBBBBBBBBBBBBBBBBBBBBBBBq .BBBBBBBBBBBBBBBBBBBBBBBBBv :iJ7vri:::1Jr..isJYr ");
- $display("\033[37m B BBBBBBB MBBBM qBBBBBBBBBBBBBBBBBBBBBB: BBBBBBBBBBBBBBBBBBBBBBBBBB B: iir: ");
- $display("\033[37m iB iBBBBBBBL BBBP. :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB B. ");
- $display("\033[37m P: BBBBBBBBBBB5v7gBBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: Br ");
- $display("\033[37m B BBBs 7BBBBBBBBBBBBBB7 :BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB .B ");
- $display("\033[37m .B :BBBB. EBBBBBQBBBBBJ .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB. B. ");
- $display("\033[37m ij qBBBBBg .. .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB .B ");
- $display("\033[37m UY QBBBBBBBBSUSPDQL...iBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBK EL ");
- $display("\033[37m B7 BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB: B: ");
- $display("\033[37m B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBYrBB vBBBBBBBBBBBBBBBBBBBBBBBB. Ls ");
- $display("\033[37m B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBi_ /UBBBBBBBBBBBBBBBBBBBBBBBBB. :B: ");
- $display("\033[37m rM .BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ..IBBBBBBBBBBBBBBBBQBBBBBBBBBB B ");
- $display("\033[37m B BBBBBBBBBdZBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBPBBBBBBBBBBBBEji:.. sBBBBBBBr Br ");
- $display("\033[37m 7B 7BBBBBBBr .:vXQBBBBBBBBBBBBBBBBBBBBBBBBBQqui::.. ...i:i7777vi BBBBBBr Bi ");
- $display("\033[37m Ki BBBBBBB rY7vr:i.... .............:..... ...:rii7vrr7r:.. 7B BBBBB Bi ");
- $display("\033[37m B. BBBBBB B: .::ir77rrYLvvriiiiiiirvvY7rr77ri:.. bU iQBB:..rI ");
- $display("\033[37m.S: 7BBBBP B. vI7. .:. B. ");
- $display("\033[37mB: ir:. :B. :rvsUjUgU. ");
- $display("\033[37mrMvrrirJKur \033[m");
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $display (" Congratulations! ");
- $display (" You have passed all patterns! ");
- $display (" time: %8t ns ",$time);
- $display ("--------------------------------------------------------------------------------------------------------------------------------------------");
- $finish;
- end endtask
- task fail; begin
- $display("\033[38;2;252;238;238m ");
- $display("\033[38;2;252;238;238m :L777777v7. ");
- $display("\033[31m i:..::::::i. ::::: :::: .:::. \033[38;2;252;238;238m .vYr::::::::i7Lvi ");
- $display("\033[31m BBBBBBBBBBBi iBBBBBL .BBBB 7BBB7 \033[38;2;252;238;238m JL..\033[38;2;252;172;172m:r777v777i::\033[38;2;252;238;238m.ijL ");
- $display("\033[31m BBBB.::::ir. BBB:BBB. .BBBv iBBB: \033[38;2;252;238;238m :K: \033[38;2;252;172;172miv777rrrrr777v7:.\033[38;2;252;238;238m:J7 ");
- $display("\033[31m BBBQ :BBY iBB7 BBB7 :BBB: \033[38;2;252;238;238m :d \033[38;2;252;172;172m.L7rrrrrrrrrrrrr77v: \033[38;2;252;238;238miI. ");
- $display("\033[31m BBBB BBB. .BBB. BBB7 :BBB: \033[38;2;252;238;238m .B \033[38;2;252;172;172m.L7rrrrrrrrrrrrrrrrr7v..\033[38;2;252;238;238mBr ");
- $display("\033[31m BBBB:r7vvj: :BBB gBBs BBB7 :BBB: \033[38;2;252;238;238m S:\033[38;2;252;172;172m v7rrrrrrrrrrrrrrrrrrr7v. \033[38;2;252;238;238mB: ");
- $display("\033[31m BBBBBBBBBB7 BBB: .BBB. BBB7 :BBB: \033[38;2;252;238;238m .D \033[38;2;252;172;172mi7rrrrrrr777rrrrrrrrrrr7v. \033[38;2;252;238;238mB. ");
- $display("\033[31m BBBB .. iBBBBBBBBBBBP BBB7 :BBB: \033[38;2;252;238;238m rv\033[38;2;252;172;172m v7rrrrrr7rirv7rrrrrrrrrr7v \033[38;2;252;238;238m:I ");
- $display("\033[31m BBBB BBBBi7vviQBBB. BBB7 :BBB. \033[38;2;252;238;238m 2i\033[38;2;252;172;172m.v7rrrrrr7i :v7rrrrrrrrrrvi \033[38;2;252;238;238mB: ");
- $display("\033[31m BBBB rBBB. BBBQ .BBBv iBBB2ir777L7\033[38;2;252;238;238m 2i.\033[38;2;252;172;172mv7rrrrrr7v \033[38;2;252;238;238m:..\033[38;2;252;172;172mv7rrrrrrrrr77 \033[38;2;252;238;238mrX ");
- $display("\033[31m .BBBB :BBBB BBBB7 .BBBB 7BBBBBBBBBBB\033[38;2;252;238;238m Yv \033[38;2;252;172;172mv7rrrrrrrv.\033[38;2;252;238;238m.B \033[38;2;252;172;172m.vrrrrrrrrrrL.\033[38;2;252;238;238m:5 ");
- $display("\033[31m . .. .... ...: .... .. .......\033[38;2;252;238;238m .q \033[38;2;252;172;172mr7rrrrrrr7i \033[38;2;252;238;238mPv \033[38;2;252;172;172mi7rrrrrrrrrv.\033[38;2;252;238;238m:S ");
- $display("\033[38;2;252;238;238m Lr \033[38;2;252;172;172m77rrrrrr77 \033[38;2;252;238;238m:B. \033[38;2;252;172;172mv7rrrrrrrrv.\033[38;2;252;238;238m:S ");
- $display("\033[38;2;252;238;238m B: \033[38;2;252;172;172m7v7rrrrrv. \033[38;2;252;238;238mBY \033[38;2;252;172;172mi7rrrrrrr7v \033[38;2;252;238;238miK ");
- $display("\033[38;2;252;238;238m .::rriii7rir7. \033[38;2;252;172;172m.r77777vi \033[38;2;252;238;238m7B \033[38;2;252;172;172mvrrrrrrr7r \033[38;2;252;238;238m2r ");
- $display("\033[38;2;252;238;238m .:rr7rri::...... . \033[38;2;252;172;172m.:i7s \033[38;2;252;238;238m.B. \033[38;2;252;172;172mv7rrrrr7L..\033[38;2;252;238;238mB ");
- $display("\033[38;2;252;238;238m .::7L7rriiiirr77rrrrrrrr72BBBBBBBBBBBBvi:.. \033[38;2;252;172;172m. \033[38;2;252;238;238mBr \033[38;2;252;172;172m77rrrrrvi \033[38;2;252;238;238mKi ");
- $display("\033[38;2;252;238;238m :rv7i::........... .:i7BBBBQbPPPqPPPdEZQBBBBBr:.\033[38;2;252;238;238m ii \033[38;2;252;172;172mvvrrrrvr \033[38;2;252;238;238mvs ");
- $display("\033[38;2;252;238;238m .S77L. .rvi:. ..:r7QBBBBBBBBBBBgri. .:BBBPqqKKqqqqPPPPPEQBBBZi \033[38;2;252;172;172m:777vi \033[38;2;252;238;238mvI ");
- $display("\033[38;2;252;238;238m B: ..Jv isi. .:rBBBBBQZPPPPqqqPPdERBBBBBi. :BBRKqqqqqqqqqqqqPKDDBB: \033[38;2;252;172;172m:7. \033[38;2;252;238;238mJr ");
- $display("\033[38;2;252;238;238m vv SB: iu rL: .iBBBQEPqqPPqqqqqqqqqqqqqPPPPbQBBB: .EBQKqqqqqqPPPqqKqPPgBB: .B: ");
- $display("\033[38;2;252;238;238m :R BgBL..s7 rU: .qBBEKPqqqqqqqqqqqqqqqqqqqqqqqqqPPPEBBB: EBEPPPEgQBBQEPqqqqKEBB: .s ");
- $display("\033[38;2;252;238;238m .U7. iBZBBBi :ji 5r .MBQqPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPKgBB: .BBBBBdJrrSBBQKqqqqKZB7 I: ");
- $display("\033[38;2;252;238;238m v2. :rBBBB: .BB:.ru7: :5. rBQqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPPBB: :. .5BKqqqqqqBB. Kr ");
- $display("\033[38;2;252;238;238m .B .BBQBB. .RBBr :L77ri2 BBqPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPbBB \033[38;2;252;172;172m.irrrrri \033[38;2;252;238;238mQQqqqqqqKRB. 2i ");
- $display("\033[38;2;252;238;238m 27 :BBU rBBBdB \033[38;2;252;172;172m iri::::: \033[38;2;252;238;238m.BQKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqKRBs\033[38;2;252;172;172mirrr7777L: \033[38;2;252;238;238m7BqqqqqqqXZB. BLv772i ");
- $display("\033[38;2;252;238;238m rY PK .:dPMB \033[38;2;252;172;172m.Y77777r.\033[38;2;252;238;238m:BEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPPBqi\033[38;2;252;172;172mirrrrrv: \033[38;2;252;238;238muBqqqqqqqqqgB :.:. B: ");
- $display("\033[38;2;252;238;238m iu 7BBi rMgB \033[38;2;252;172;172m.vrrrrri\033[38;2;252;238;238mrBEqKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPQgi\033[38;2;252;172;172mirrrrv. \033[38;2;252;238;238mQQqqqqqqqqqXBb .BBB .s:. ");
- $display("\033[38;2;252;238;238m i7 BBdBBBPqbB \033[38;2;252;172;172m.vrrrri\033[38;2;252;238;238miDgPPbPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPQDi\033[38;2;252;172;172mirr77 \033[38;2;252;238;238m:BdqqqqqqqqqqPB. rBB. .:iu7 ");
- $display("\033[38;2;252;238;238m iX.:iBRKPqKXB.\033[38;2;252;172;172m 77rrr\033[38;2;252;238;238mi7QPBBBBPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPB7i\033[38;2;252;172;172mrr7r \033[38;2;252;238;238m.vBBPPqqqqqqKqBZ BPBgri: 1B ");
- $display("\033[38;2;252;238;238m ivr .BBqqKXBi \033[38;2;252;172;172mr7rri\033[38;2;252;238;238miQgQi QZKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPEQi\033[38;2;252;172;172mirr7r. \033[38;2;252;238;238miBBqPqqqqqqPB:.QPPRBBB LK ");
- $display("\033[38;2;252;238;238m :I. iBgqgBZ \033[38;2;252;172;172m:7rr\033[38;2;252;238;238miJQPB. gRqqqqqqqqPPPPPPPPqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqPQ7\033[38;2;252;172;172mirrr7vr. \033[38;2;252;238;238mUBqqPPgBBQPBBKqqqKB B ");
- $display("\033[38;2;252;238;238m v7 .BBR: \033[38;2;252;172;172m.r7ri\033[38;2;252;238;238miggqPBrrBBBBBBBBBBBBBBBBBBQEPPqqPPPqqqqqqqqqqqqqqqqqqqqqqqqqPgPi\033[38;2;252;172;172mirrrr7v7 \033[38;2;252;238;238mrBPBBP:.LBbPqqqqqB. u. ");
- $display("\033[38;2;252;238;238m .j. . \033[38;2;252;172;172m :77rr\033[38;2;252;238;238miiBPqPbBB::::::.....:::iirrSBBBBBBBQZPPPPPqqqqqqqqqqqqqqqqqqqqEQi\033[38;2;252;172;172mirrrrrr7v \033[38;2;252;238;238m.BB: :BPqqqqqDB .B ");
- $display("\033[38;2;252;238;238m YL \033[38;2;252;172;172m.i77rrrr\033[38;2;252;238;238miLQPqqKQJ. \033[38;2;252;172;172m ............ \033[38;2;252;238;238m..:irBBBBBBZPPPqqqqqqqPPBBEPqqqdRr\033[38;2;252;172;172mirrrrrr7v \033[38;2;252;238;238m.B .iBB dQPqqqqPBi Y: ");
- $display("\033[38;2;252;238;238m :U:.\033[38;2;252;172;172mrv7rrrrri\033[38;2;252;238;238miPgqqqqKZB.\033[38;2;252;172;172m.v77777777777777ri::.. \033[38;2;252;238;238m ..:rBBBBQPPqqqqPBUvBEqqqPRr\033[38;2;252;172;172mirrrrrrvi\033[38;2;252;238;238m iB:RBBbB7 :BQqPqKqBR r7 ");
- $display("\033[38;2;252;238;238m iI.\033[38;2;252;172;172m.v7rrrrrrri\033[38;2;252;238;238midgqqqqqKB:\033[38;2;252;172;172m 77rrrrrrrrrrrrr77777777ri:.. \033[38;2;252;238;238m .:1BBBEPPB: BbqqPQr\033[38;2;252;172;172mirrrr7vr\033[38;2;252;238;238m .BBBZPqqDB .JBbqKPBi vi ");
- $display("\033[38;2;252;238;238m :B \033[38;2;252;172;172miL7rrrrrrrri\033[38;2;252;238;238mibgqqqqqqBr\033[38;2;252;172;172m r7rrrrrrrrrrrrrrrrrrrrr777777ri:. \033[38;2;252;238;238m .iBBBBi .BbqqdRr\033[38;2;252;172;172mirr7v7: \033[38;2;252;238;238m.Bi.dBBPqqgB: :BPqgB B ");
- $display("\033[38;2;252;238;238m .K.i\033[38;2;252;172;172mv7rrrrrrrri\033[38;2;252;238;238miZgqqqqqqEB \033[38;2;252;172;172m.vrrrrrrrrrrrrrrrrrrrrrrrrrrr777vv7i. \033[38;2;252;238;238m :PBBBBPqqqEQ\033[38;2;252;172;172miir77: \033[38;2;252;238;238m:BB: .rBPqqEBB. iBZB. Rr ");
- $display("\033[38;2;252;238;238m iM.:\033[38;2;252;172;172mv7rrrrrrrri\033[38;2;252;238;238mUQPqqqqqPBi\033[38;2;252;172;172m i7rrrrrrrrrrrrrrrrrrrrrrrrr77777i. \033[38;2;252;238;238m. :BddPqqqqEg\033[38;2;252;172;172miir7. \033[38;2;252;238;238mrBBPqBBP. :BXKqgB BBB. 2r ");
- $display("\033[38;2;252;238;238m :U:.\033[38;2;252;172;172miv77rrrrri\033[38;2;252;238;238mrBPqqqqqqPB: \033[38;2;252;172;172m:7777rrrrrrrrrrrrrrr777777ri. \033[38;2;252;238;238m.:uBBBBZPqqqqqqPQL\033[38;2;252;172;172mirr77 \033[38;2;252;238;238m.BZqqPB: qMqqPB. Yv: Ur ");
- $display("\033[38;2;252;238;238m 1L:.\033[38;2;252;172;172m:77v77rii\033[38;2;252;238;238mqQPqqqqqPbBi \033[38;2;252;172;172m .ir777777777777777ri:.. \033[38;2;252;238;238m.:rBBBRPPPPPqqqqqqqgQ\033[38;2;252;172;172miirr7vr \033[38;2;252;238;238m:BqXQ: .BQPZBBq ...:vv. ");
- $display("\033[38;2;252;238;238m LJi..\033[38;2;252;172;172m::r7rii\033[38;2;252;238;238mRgKPPPPqPqBB:. \033[38;2;252;172;172m ............ \033[38;2;252;238;238m..:rBBBBPPqqKKKKqqqPPqPbB1\033[38;2;252;172;172mrvvvvvr \033[38;2;252;238;238mBEEDQBBBBBRri. 7JLi ");
- $display("\033[38;2;252;238;238m .jL\033[38;2;252;172;172m 777rrr\033[38;2;252;238;238mBBBBBBgEPPEBBBvri:::::::::irrrbBBBBBBDPPPPqqqqqqXPPZQBBBBr\033[38;2;252;172;172m.......\033[38;2;252;238;238m.:BBBBg1ri:....:rIr ");
- $display("\033[38;2;252;238;238m vI \033[38;2;252;172;172m:irrr:....\033[38;2;252;238;238m:rrEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBQQBBBBBBBBBBBBBQr\033[38;2;252;172;172mi:...:. \033[38;2;252;238;238m.:ii:.. .:.:irri:: ");
- $display("\033[38;2;252;238;238m 71vi\033[38;2;252;172;172m:::irrr::....\033[38;2;252;238;238m ...:..::::irrr7777777777777rrii::.... ..::irvrr7sUJYv7777v7ii.. ");
- $display("\033[38;2;252;238;238m .i777i. ..:rrri77rriiiiiii:::::::...............:::iiirr7vrrr:. ");
- $display("\033[38;2;252;238;238m .:::::::::::::::::::::::::::::: \033[m");
- end endtask
- endmodule
複製代碼 |