⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disasm_debug.v

📁 使用CPLD仿真一个80383的CPU,很值得参考一下,难得
💻 V
📖 第 1 页 / 共 3 页
字号:
`include "timescale.v"

module testbench();
	reg rst;
	reg clk;
	reg [3:0] ins_len;
	reg [31:0] opcode, opcode2;

	reg [7:0] mem [0:16'h1FFF];
	reg [7:0] ip_next;



always #20 clk = ~clk;

always @ (posedge clk) begin
	ip_next = ip_next+ins_len;
	opcode[7:0] <= mem[ip_next+3];
	opcode[15:8] <= mem[ip_next+2];
	opcode[23:16] <= mem[ip_next+1];
	opcode[31:24] <= mem[ip_next];
	opcode2[7:0] <= mem[ip_next+7];
	opcode2[15:8] <= mem[ip_next+6];
	opcode2[23:16] <= mem[ip_next+5];
	opcode2[31:24] <= mem[ip_next+4];
//	$display("opcode = %h",mem[ip_next]);
end

initial begin
	$display("80386 start->");
	$readmemh("prom.mem.v", mem, 0, 100); 
	
	ip_next[7:0] = 0;
	ins_len = 0;
	rst = 0;
	clk = 0;
	
	opcode[7:0] <= mem[ip_next+3];
	opcode[15:8] <= mem[ip_next+2];
	opcode[23:16] <= mem[ip_next+1];
	opcode[31:24] <= mem[ip_next];
	
	repeat(2)	@(posedge clk); 
	rst = 1;
	repeat(2)	@(posedge clk);
	repeat(1)	@(negedge clk);
	rst = 0;
	repeat(180)	@(posedge clk);

  $display("done!");
  $dumpvars; 
  $finish;
end




always @ (negedge clk) begin
casex (opcode)
32'b01100111????????????????????????: begin /* address size */
	ins_len = 1;
end
32'b11110000????????????????????????: begin /* LOCK */
	ins_len = 1;
end
32'b01100110????????????????????????: begin /* operand size */
	ins_len = 1;
end
32'b00101110????????????????????????: begin /* CS segment override */
	ins_len = 1;
end
32'b00111110????????????????????????: begin /* DS segment override */
	ins_len = 1;
end
32'b00100110????????????????????????: begin /* ES segment override */
	ins_len = 1;
end
32'b01100100????????????????????????: begin /* FS segment override */
	ins_len = 1;
end
32'b01100101????????????????????????: begin /* GS segment override */
	ins_len = 1;
end
32'b00110110????????????????????????: begin /* SS segment override */
	ins_len = 1;
end
32'b00110111????????????????????????: begin /* AAA 1 */
	ins_len = 1;
	$display("AAA");
end
32'b1101010100001010????????????????: begin /* AAD 2 */
	ins_len = 2;
	$display("AAD");
end
32'b1101010000001010????????????????: begin /* AAM 2 */
	ins_len = 2;
	$display("AAM");
end
32'b00111111????????????????????????: begin /* AAS 1 */
	ins_len = 1;
	$display("AAS");
end
32'b0001000?11??????????????????????: begin /* ADC 2 reg1 to reg2 */
	ins_len = 2;
	$display("ADC r1,r2");
end
32'b0001001?11??????????????????????: begin /* ADC 2 reg2 to reg1 */
	ins_len = 2;
	$display("ADC r2,r1");
end
32'b0001001?????????????????????????: begin /* ADC 2 mem to reg */
	ins_len = 2;
	$display("ADC mem,r");
end
32'b0001000?????????????????????????: begin /* ADC 2 reg to mem */
	ins_len = 2;
	$display("ADC r,mem");
end
32'b100000??11010???????????????????: begin /* ADC 3 immediate to reg */
	ins_len = 4;
	$display("ADC #,r");
end
32'b0001010?????????????????????????: begin /* ADC 2 immediage to AL,AX or EAX */
	ins_len = 3;
	$display("ADC #,EAX");
end
32'b100000????010???????????????????: begin /* ADC 3 immediage to mem */
	ins_len = 4;
	$display("ADC #,mem");
end
32'b0000000?11??????????????????????: begin /* ADD 2 reg1 to reg2 */
	ins_len = 2;
	$display("ADD r1,r2");
end
32'b0000001?11??????????????????????: begin /* ADD 2 reg2 to reg1 */
	ins_len = 2;
	$display("ADD r2,r1");
end
32'b0000001?????????????????????????: begin /* ADD 2 mem to reg */
	ins_len = 2;
	$display("ADD mem,r");
end
32'b0000000?????????????????????????: begin /* ADD 2 reg to mem */
	ins_len = 2;
	$display("ADD r,mem");
end
32'b100000??11000???????????????????: begin /* ADD 3 immediate to reg */
	ins_len = 4;
	$display("ADD #,r");
end
32'b0000010?????????????????????????: begin /* ADD 2 imediate to AL,AX,or EAX */
	ins_len = 3;
	$display("ADD #,EAX");
end
32'b100000????000???????????????????: begin /* ADD 3 imediate to mem */
	ins_len = 4;
	$display("ADD #,mem");
end
32'b0010000?11??????????????????????: begin /* AND 2 reg1 to reg2 */
	ins_len = 2;
	$display("AND r1,r2");
end
32'b0010001?11??????????????????????: begin /* AND 2 reg2 to reg1 */
	ins_len = 2;
	$display("AND r2,r1");
end
32'b0010001?????????????????????????: begin /* AND 2 mem to reg */
	ins_len = 2;
	$display("AND mem,r");
end
32'b0010000?????????????????????????: begin /* AND 2 reg to mem */
	ins_len = 2;
	$display("AND r,mem");
end
32'b100000??11100???????????????????: begin /* AND 3 immediate to reg */
	ins_len = 4;
	$display("AND #,r");
end
32'b0010010?????????????????????????: begin /* AND 2 immediate to AL,AX,EAX */
	ins_len = 3;
	$display("AND #,EAX");
end
32'b100000????100???????????????????: begin /* AND 3 immediate to mem */
	ins_len = 4;
	$display("AND #,mem");
end
32'b0110001111??????????????????????: begin /* ARPL 2 from reg */
	ins_len = 2;
	$display("ARPL r");
end
32'b01100011????????????????????????: begin /* ARPL 2 from mem */
	ins_len = 2;
	$display("ARPL mem");
end
32'b01100010????????????????????????: begin /* BOUND 2 */
	ins_len = 2;
	$display("BOUND");
end
32'b000011111011110011??????????????: begin /* BSF 3 reg1,reg2 */
	ins_len = 3;
	$display("BSF r1,r2");
end
32'b0000111110111100????????????????: begin /* BSF 3 mem,reg */
	ins_len = 3;
	$display("BSF mem,r");
end
32'b000011111011110111??????????????: begin /* BSR 3 reg1,reg2 */
	ins_len = 3;
	$display("BSR r1,r2");
end
32'b0000111110111101????????????????: begin /* BSR 3 mem,reg */
	ins_len = 3;
	$display("BSR mem,r");
end
32'b0000111111001???????????????????: begin /* BSWAP 2 */
	ins_len = 2;
	$display("BSWAP");
end
32'b000011111011101011100???????????: begin /* BT 4 reg,immediate */
	ins_len = 4;
	$display("BT r,#");
end
32'b0000111110111010???100??????????: begin /* BT 4 mem,immediate */
	ins_len = 4;
	$display("BT mem,#");
end
32'b000011111010001111??????????????: begin /* BT 3 reg1,reg2 */
	ins_len = 3;
	$display("BT r1,r2");
end
32'b0000111110100011????????????????: begin /* BT 3 mem,reg */
	ins_len = 3;
	$display("BT mem,r");
end
32'b000011111011101011111???????????: begin /* BTC 4 reg,immediate */
	ins_len = 4;
	$display("BTC r,#");
end
32'b0000111110111010???111??????????: begin /* BTC 4 mem,immediate */
	ins_len = 4;
	$display("BTC mem,#");
end
32'b000011111011101111??????????????: begin /* BTC 3 reg1,reg2 */
	ins_len = 3;
	$display("BTC r1,r2");
end
32'b0000111110111011????????????????: begin /* BTC 3 mem,reg */
	ins_len = 3;
	$display("BTC mem,r");
end
32'b000011111011101011110???????????: begin /* BTR 4 reg,immediate */
	ins_len = 4;
	$display("BTR r,#");
end
32'b0000111110111010???110??????????: begin /* BTR 4 mem,immediate */
	ins_len = 4;
	$display("BTR mem,#");
end
32'b000011111011001111??????????????: begin /* BTR 3 reg1,reg2 */
	ins_len = 3;
	$display("BTR r1,r2");
end
32'b0000111110110011????????????????: begin /* BTR 3 mem,reg */
	ins_len = 3;
	$display("BTR mem,r");
end
32'b000011111011101011101???????????: begin /* BTS 4 reg,immediate */
	ins_len = 4;
	$display("BTS r,#");
end
32'b0000111110111010???101??????????: begin /* BTS 4 mem,immediate */
	ins_len = 4;
	$display("BTS mem,#");
end
32'b000011111010101111??????????????: begin /* BTS 3 reg1,reg2 */
	ins_len = 3;
	$display("BTS r1,r2");
end
32'b0000111110101011????????????????: begin /* BTS 3 mem,reg */
	ins_len = 3;
	$display("BTS mem,r");
end
32'b11101000????????????????????????: begin /* CALL 3 same segment direct */
	ins_len = 3;
	$display("CALL");
end
32'b1111111111010???????????????????: begin /* CALL 2 same segment reg indirect */
	ins_len = 2;
	$display("CALL");
end
32'b11111111???010??????????????????: begin /* CALL 2 same segment mem indirect */
	ins_len = 2;
	$display("CALL");
end
32'b10011010????????????????????????: begin /* CALL 2 other segment direct */
	ins_len = 2;
	$display("CALL");
end
32'b11111111???011??????????????????: begin /* CALL 2 other segment indirect */
	ins_len = 2;
	$display("CALL");
end
32'b10011000????????????????????????: begin /* CBW 1 */
	ins_len = 1;
	$display("CBW");
end
32'b10011001????????????????????????: begin /* CDQ 1 */
	ins_len = 1;
	$display("CDQ");
end
32'b11111000????????????????????????: begin /* CLC 1 */
	ins_len = 1;
	$display("CLC");
end
32'b11111100????????????????????????: begin /* CLD 1 */
	ins_len = 1;
	$display("CLD");
end
32'b11111010????????????????????????: begin /* CLI 1 */
	ins_len = 1;
	$display("CLI");
end
32'b0000111100000110????????????????: begin /* CLTS 2 */
	ins_len = 2;
	$display("CLTS");
end
32'b11110101????????????????????????: begin /* CMC 1 */
	ins_len = 1;
	$display("CMC");
end
32'b0011100?11??????????????????????: begin /* CMP 2 reg1 reg2 */
	ins_len = 2;
	$display("CMP r1,r2");
end
32'b0011101?11??????????????????????: begin /* CMP 2 reg2 reg1 */
	ins_len = 2;
	$display("CMP r2,r1");
end
32'b0011100?????????????????????????: begin /* CMP 2 mem reg */
	ins_len = 2;
	$display("CMP mem,r");
end
32'b0011101?????????????????????????: begin /* CMP 2 reg mem */
	ins_len = 2;
	$display("CMP r,mem");
end
32'b100000??11111???????????????????: begin /* CMP 3 immediate reg */
	ins_len = 3;
	$display("CMP #,r");
end
32'b0011110?????????????????????????: begin /* CMP 2 immediate with AL,AX or EAX */
	ins_len = 2;
	$display("CMP #,EAX");
end
32'b100000?????111??????????????????: begin /* CMP 3 immedaite with mem */
	ins_len = 3;
	$display("CMP #,mem");
end
32'b1010011?????????????????????????: begin /* CMPS 1 */
	ins_len = 1;
	$display("CMPS");
end
32'b000011111011000?11??????????????: begin /* CMPXCHG 3 reg1,reg2 */
	ins_len = 3;
	$display("CMPXCHG r1,r2");
end
32'b000011111011000?????????????????: begin /* CMPXCHG 3 mem,reg */
	ins_len = 3;
	$display("CMPXCHG mem,r");
end
32'b0000111110100010????????????????: begin /* CPUID 2 */
	ins_len = 2;
	$display("CPUID");
end
32'b10011001????????????????????????: begin /* CWD 1 */
	ins_len = 1;
	$display("CWD");
end
32'b10011000????????????????????????: begin /* CWDE 1 */
	ins_len = 1;
	$display("CWDE");
end
32'b00100111????????????????????????: begin /* DAA 1 */
	ins_len = 1;
	$display("DAA");
end
32'b00101111????????????????????????: begin /* DAS 1 */
	ins_len = 1;
	$display("DAS");
end
32'b1111111?11001???????????????????: begin /* DEC 2 reg */
	ins_len = 2;
	$display("DEC r");
end
32'b01001???????????????????????????: begin /* DEC 1 reg(altmeate encoding) */
	ins_len = 1;
	$display("DEC r");
end
32'b1111111????001??????????????????: begin /* DEC 2 */
	ins_len = 2;
	$display("DEC");
end
32'b1111011?11110???????????????????: begin /* DIV 2 AL,AX,EAX by reg */
	ins_len = 2;
	$display("DIV EAX,r");
end
32'b1111011????110??????????????????: begin /* DIV 2 AL,AX,EAX by mem */
	ins_len = 2;
	$display("DIV EAX,mem");
end
32'b11001000????????????????????????: begin /* ENTER 4 */
	ins_len = 4;
	$display("ENTER");
end
32'b11110100????????????????????????: begin /* HLT 1 */
	ins_len = 1;
	$display("HLT");
end
32'b1111011?11111???????????????????: begin /* IDIV 2 AL,AX,EAX by reg */
	ins_len = 2;
	$display("IDIV EAX,r");
end
32'b1111011????111??????????????????: begin /* IDIV 2 AL,AX,EAX by mem */
	ins_len = 2;
	$display("IDIV EAX,mem");
end
32'b1111011?11101???????????????????: begin /* IMUL 2 AL,AX,EAX with reg */
	ins_len = 2;
	$display("IMUL EAX,r");
end
32'b1111011????101??????????????????: begin /* IMUL 2 AL,AX,EAX with mem */
	ins_len = 2;
	$display("IMUL EAX,mem");
end
32'b0000111110101111????????????????: begin /* IMUL 3 reg1 with reg2 */
	ins_len = 3;
	$display("IMUL r1,r2");
end
32'b0000111110101111????????????????: begin /* IMUL 3 reg with mem */
	ins_len = 3;
	$display("IMUL r,mem");
end
32'b011010?111??????????????????????: begin /* IMUL 3 reg1 with immediate to reg2 */
	ins_len = 3;
	$display("IMUL r1,#,r2");
end
32'b011010?1????????????????????????: begin /* IMUL 3 mem with immediate to reg */
	ins_len = 3;
	$display("IMUL mem,#,r");
end
32'b1110010?????????????????????????: begin /* IN 2 fixed port */
	ins_len = 2;
	$display("IN");
end
32'b1110110?????????????????????????: begin /* IN 2 varable port */
	ins_len = 2;
	$display("IN");
end
32'b1111111?11000???????????????????: begin /* INC 2 reg */
	ins_len = 2;
	$display("INC r");
end
32'b01000???????????????????????????: begin /* INC 1 reg(alternate encoding) */
	ins_len = 1;
	$display("INC r");
end
32'b1111111????000??????????????????: begin /* INC 2 mem */
	ins_len = 2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -