1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-13 15:27:46 +00:00

3253 lines
75 KiB
Verilog

module apr(
input wire clk,
input wire reset,
// keys
input wire key_start,
input wire key_read_in,
input wire key_mem_cont,
input wire key_inst_cont,
input wire key_mem_stop,
input wire key_inst_stop,
input wire key_exec,
input wire key_io_reset,
input wire key_dep,
input wire key_dep_nxt,
input wire key_ex,
input wire key_ex_nxt,
// switches
input wire sw_addr_stop,
input wire sw_mem_disable,
input wire sw_repeat,
input wire sw_power,
input wire [0:35] datasw,
input wire [18:35] mas,
// maintenance switches
input wire sw_rim_maint,
input wire sw_repeat_bypass,
input wire sw_art3_maint,
input wire sw_sct_maint,
input wire sw_split_cyc,
// lights
output reg [0:17] ir,
output reg [0:35] mi,
output reg [0:35] ar,
output reg [0:35] mb,
output reg [0:35] mq,
output reg [18:35] pc,
output reg [18:35] ma,
output reg run,
output reg mc_stop,
output reg pi_active,
output reg [1:7] pih,
output reg [1:7] pir,
output reg [1:7] pio,
output reg [18:25] pr,
output reg [18:25] rlr,
output wire [18:25] rla,
output wire [0:7] ff0,
output wire [0:7] ff1,
output wire [0:7] ff2,
output wire [0:7] ff3,
output wire [0:7] ff4,
output wire [0:7] ff5,
output wire [0:7] ff6,
output wire [0:7] ff7,
output wire [0:7] ff8,
output wire [0:7] ff9,
output wire [0:7] ff10,
output wire [0:7] ff11,
output wire [0:7] ff12,
output wire [0:7] ff13,
// membus
output wire membus_wr_rs,
output wire membus_rq_cyc,
output wire membus_rd_rq,
output wire membus_wr_rq,
output wire [21:35] membus_ma,
output wire [18:21] membus_sel,
output wire membus_fmc_select,
output wire [0:35] membus_mb_out,
input wire membus_addr_ack,
input wire membus_rd_rs,
input wire [0:35] membus_mb_in,
// IO bus
output wire iobus_iob_poweron,
output wire iobus_iob_reset,
output wire iobus_datao_clear,
output wire iobus_datao_set,
output wire iobus_cono_clear,
output wire iobus_cono_set,
output wire iobus_iob_fm_datai,
output wire iobus_iob_fm_status,
output wire [3:9] iobus_ios,
output wire [0:35] iobus_iob_out,
input wire [1:7] iobus_pi_req,
input wire [0:35] iobus_iob_in
);
assign ff0 = { key_ex_st, key_ex_sync, key_dep_st, key_dep_sync, key_rdwr, mc_rd, mc_wr, mc_rq };
assign ff1 = { if1a, af0, af3, af3a, et4_ar_pse, f1a, f4a, f6a };
assign ff2 = { sf3, sf5a, sf7, ar_com_cont, blt_f0a, blt_f3a, blt_f5a, iot_f0a };
assign ff3 = { fpf1, fpf2, faf1, faf2, faf3, faf4, fmf1, fmf2 };
assign ff4 = { fdf1, fdf2, nr_round, nrf1, nrf2, nrf3, fsf1, chf7 };
assign ff5 = { dsf1, dsf2, dsf3, dsf4, dsf5, dsf6, dsf7, dsf8 };
assign ff6 = { dsf9, msf1, mpf1, mpf2, mc_split_cyc_sync, mc_stop_sync, shf1, sc_eq_777 };
assign ff7 = { chf1, chf2, chf3, chf4, chf5, chf6, lcf1, dcf1 };
assign ff8 = { pi_ov, pi_cyc, pi_rq, iot_go, a_long, ma_eq_mas, uuo_f1, cpa_pdl_ov };
assign ff9 = fe[1:8];
assign ff10 = sc[1:8];
assign ff11 = { ~ex_user, cpa_illeg_op, ex_ill_op, ex_uuo_sync, ex_pi_sync, mq36, sc[0], fe[0] };
assign ff12 = { key_rim_sbr, ar_cry0_xor_cry1, ar_cry0, ar_cry1, ar_ov_flag, ar_cry0_flag, ar_cry1_flag, ar_pc_chg_flag };
assign ff13 = { cpa_non_exist_mem, cpa_clock_enable, cpa_clock_flag, cpa_pc_chg_enable, cpa_arov_enable, cpa_pia[33:35] };
// TODO:
reg a_long = 1'b0;
/*
* KEY
*/
// TODO: repeat
// reg run;
reg key_ex_st;
reg key_dep_st;
reg key_ex_sync;
reg key_dep_sync;
reg key_rim_sbr;
reg key_rdwr;
wire key_clr_rim = ~key_read_in |
~key_mem_cont & ~key_inst_cont;
wire key_ma_fm_mas = key_ex_sync | key_dep_sync |
key_start_OR_read_in;
wire key_execute = ~run & key_exec;
wire key_start_OR_read_in = key_start | key_read_in;
wire key_start_OR_cont_OR_read_in = key_inst_cont |
key_start_OR_read_in;
wire key_ex_OR_dep_nxt = key_ex_nxt | key_dep_nxt;
wire key_dp_OR_dp_nxt = key_dep_sync | key_dep_nxt;
wire key_run_AND_NOT_ex_OR_dep = run & ~key_ex_OR_dep_st;
wire key_ex_OR_ex_nxt = key_ex_sync | key_ex_nxt;
wire key_manual = key_ex | key_ex_nxt |
key_dep | key_dep_nxt |
key_start | key_inst_cont | key_mem_cont |
key_io_reset | key_execute | key_read_in;
wire key_ex_OR_dep_st = key_ex_st | key_dep_st;
wire key_run_AND_ex_OR_dep = run & key_ex_OR_dep_st;
wire key_execute_OR_dp_OR_dp_nxt = key_execute | key_dp_OR_dp_nxt;
wire run_clr;
wire mr_pwr_clr;
wire mr_start = kt1 & key_io_reset | mr_pwr_clr;
wire mr_clr = kt1 & key_manual & ~key_mem_cont |
mr_pwr_clr | uuo_t1 | iat0 | xct_t0 | it0;
wire kt0;
wire kt0a;
wire kt1;
wire kt2;
wire kt3;
wire kt4;
wire key_go;
wire key_rdwr_ret;
wire key_ma_clr = kt1 & key_ma_fm_mas;
wire key_ma_fm_masw1 = kt2 & key_ma_fm_mas;
wire key_ma_inc = kt1 & key_ex_OR_dep_nxt;
wire key_ar_clr = kt1 & key_execute_OR_dp_OR_dp_nxt;
wire key_ar_fm_datasw1;
wire key_rd = kt3 & key_ex_OR_ex_nxt;
wire key_wr = kt3 & key_dp_OR_dp_nxt;
wire kt0a_D, kt1_D, kt2_D, kt3_D;
pg key_pg0(.clk(clk), .reset(reset), .in(key_inst_stop), .p(run_clr));
pg key_pg1(.clk(clk), .reset(reset), .in(sw_power), .p(mr_pwr_clr));
pg key_pg2(.clk(clk), .reset(reset), .in(key_manual), .p(kt0));
pg key_pg3(.clk(clk), .reset(reset),
.in(kt2 & key_execute_OR_dp_OR_dp_nxt |
cpa & iobus_iob_fm_datai),
.p(key_ar_fm_datasw1));
pa key_pa0(.clk(clk), .reset(reset), .in(kt0), .p(kt0a));
pa key_pa1(.clk(clk), .reset(reset),
.in(kt0a_D & ~run |
kt0a & key_mem_cont | // TODO: check run?
st7 & run & key_ex_OR_dep_st),
.p(kt1));
pa key_pa2(.clk(clk), .reset(reset), .in(kt1_D), .p(kt2));
pa key_pa3(.clk(clk), .reset(reset), .in(kt2_D), .p(kt3));
pa key_pa4(.clk(clk), .reset(reset),
.in(kt3 & key_execute |
key_rdwr_ret |
mc_stop_set & key_mem_cont |
st7 & key_start_OR_cont_OR_read_in),
.p(kt4));
pa key_pa5(.clk(clk), .reset(reset),
.in(kt3 & key_start_OR_cont_OR_read_in |
key_run_AND_ex_OR_dep),
.p(key_go));
pa key_pa6(.clk(clk), .reset(reset),
.in(key_rdwr & mc_rs_t1),
.p(key_rdwr_ret));
dly100ns key_dly0(.clk(clk), .reset(reset), .in(kt0a), .p(kt0a_D));
dly200ns key_dly1(.clk(clk), .reset(reset), .in(kt1), .p(kt1_D));
dly200ns key_dly2(.clk(clk), .reset(reset), .in(kt2), .p(kt2_D));
dly100ns key_dly3(.clk(clk), .reset(reset), .in(kt3), .p(kt3_D));
`ifdef simulation
/* add to this as needed */
always @(posedge reset) begin
run <= 0;
key_ex_st <= 0;
key_dep_st <= 0;
ar <= 0;
mb <= 0;
mq <= 0;
end
`endif
always @(posedge clk) begin
if(run_clr |
et0a & key_inst_stop |
et0a & ir_jrst & ir[10] & ~ex_user |
mr_pwr_clr)
run <= 0;
if(key_go)
run <= 1;
if(kt0a | key_go) begin
key_ex_st <= 0;
key_dep_st <= 0;
key_ex_sync <= 0;
key_dep_sync <= 0;
end
if(et0a) begin
if(key_ex_sync) key_ex_st <= 1;
if(key_dep_sync) key_dep_st <= 1;
end
if(kt0a) begin
if(key_ex) key_ex_sync <= 1;
if(key_dep) key_dep_sync <= 1;
end
if(key_rd | key_wr)
key_rdwr <= 1;
if(mr_clr | key_rdwr_ret)
key_rdwr <= 0;
if(kt1 & key_read_in | sw_rim_maint)
key_rim_sbr <= 1;
else if(kt1 & key_clr_rim | it1a & ~ma18_31_eq_0)
key_rim_sbr <= 0;
end
/*
* I
*/
reg if1a;
wire at1_inh;
// equivalent: ia_inh = at1_inh | (pi_rq & ~pi_cyc)
wire ia_NOT_int = ~at1_inh & (~pi_rq | pi_cyc);
wire iat0;
wire it0;
wire it1;
wire it1a;
pa i_pa0(.clk(clk), .reset(reset),
.in(key_go | (st7 & key_run_AND_NOT_ex_OR_dep)),
.p(it0));
pa i_pa1(.clk(clk), .reset(reset),
.in(pi_sync_D & pi_rq & ~pi_cyc),
.p(iat0));
pa i_pa2(.clk(clk), .reset(reset),
.in(iat0_D1 |
pi_sync_D & if1a & ia_NOT_int),
.p(it1));
pa i_pa3(.clk(clk), .reset(reset),
.in(mc_rs_t1 & if1a |
kt3_D & key_execute |
xct_t0_D),
.p(it1a));
wire it0_D, iat0_D0, iat0_D1;
ldly100us i_dly0(.clk(clk), .reset(reset),
.in(run_clr),
.l(at1_inh));
dly50ns i_dly1(.clk(clk), .reset(reset),
.in(it0),
.p(it0_D));
dly100ns i_dly2(.clk(clk), .reset(reset),
.in(iat0),
.p(iat0_D0));
dly200ns i_dly23(.clk(clk), .reset(reset),
.in(iat0),
.p(iat0_D1));
always @(posedge clk) begin
if(mr_clr | it1a)
if1a <= 0;
if(it0_D | it1 | uuo_t2)
if1a <= 1;
end
/*
* A
*/
reg af0;
reg af3;
reg af3a;
wire at0;
wire at1;
wire at2;
wire at3;
wire at3a;
wire at4;
wire at5;
pa a_pa0(.clk(clk), .reset(reset),
.in(it1a | cht9 | mc_rs_t1 & af0),
.p(at0));
pa a_pa1(.clk(clk), .reset(reset),
.in(pi_sync_D & ~if1a & ia_NOT_int),
.p(at1));
pa a_pa2(.clk(clk), .reset(reset),
.in(at1 & ~ir14_17_eq_0),
.p(at2));
pa a_pa3(.clk(clk), .reset(reset),
.in(mc_rs_t1 & af3),
.p(at3));
pa a_pa4(.clk(clk), .reset(reset),
.in(ar_t3 & af3a),
.p(at3a));
pa a_pa5(.clk(clk), .reset(reset),
.in(at1 & ir14_17_eq_0 | at3a_D),
.p(at4));
pa a_pa6(.clk(clk), .reset(reset),
.in(at4 & ir[13]),
.p(at5));
wire at3a_D, at5_D;
dly100ns a_dly0(.clk(clk), .reset(reset),
.in(at3a),
.p(at3a_D));
dly50ns a_dly1(.clk(clk), .reset(reset),
.in(at5),
.p(at5_D));
always @(posedge clk) begin
if(mr_clr | at0)
af0 <= 0;
if(at5)
af0 <= 1;
if(mr_clr | at3)
af3 <= 0;
if(at2)
af3 <= 1;
if(mr_clr | at3a)
af3a <= 0;
if(at3)
af3a <= 1;
end
/*
* F
*/
reg f1a;
reg f4a;
reg f6a;
wire ft0;
wire ft1;
wire ft1a;
wire ft3;
wire ft4;
wire ft4a;
wire ft5;
wire ft6;
wire ft6a;
wire ft7;
wire f_c_c_aclt = jp_jra | ir_blt;
wire f_c_c_acrt = jp_pop | jp_popj;
wire f_ac_2 = sh_ac_2 | ir_md_f_ac_2;
wire f_c_c_aclt_OR_rt = f_c_c_aclt | f_c_c_acrt;
wire f_ac_2_etc = f_c_c_aclt_OR_rt | f_ac_2;
wire f_ac_inh = hwt_11 | fwt_00 | fwt_01 | fwt_11 |
ir_xct | ex_ir_uuo | jp_jsp | jp_jsr |
ir_iot | ir_254_7 | memac_mem |
ch_load | ch_inc_op | ch_NOT_inc_op;
wire f_c_e = hwt_00 | fwt_00 | ir_xct | jp_push |
iot_datao | ir_fp | ir_md_f_c_e | ch_load |
ch_NOT_inc_op | accp_dir | acbm_dir | boole_as_00;
wire f_c_e_pse = hwt_10 | hwt_11 | fwt_11 | iot_blk |
ir_exch | ch_dep | ch_inc_op | memac_mem |
boole_as_10 | boole_as_11;
wire f_c_e_OR_pse = f_c_e | f_c_e_pse;
pa f_pa0(.clk(clk), .reset(reset),
.in(at4 & ~ir[13] | iot_t0a_D),
.p(ft0));
pa f_pa1(.clk(clk), .reset(reset),
.in(ft0 & ~f_ac_inh),
.p(ft1));
pa f_pa2(.clk(clk), .reset(reset),
.in(f1a & mc_rs_t1 | blt_t6_D),
.p(ft1a));
pa f_pa4(.clk(clk), .reset(reset),
.in(ft1a_D & f_c_c_aclt_OR_rt),
.p(ft3));
pa f_pa5(.clk(clk), .reset(reset),
.in(ft3_D | ft1a_D & f_ac_2),
.p(ft4));
pa f_pa6(.clk(clk), .reset(reset),
.in(f4a & mc_rs_t1),
.p(ft4a));
pa f_pa7(.clk(clk), .reset(reset),
.in(ft0 & f_ac_inh |
ft1a_D & ~f_ac_2_etc |
ft4a_D),
.p(ft5));
pa f_pa8(.clk(clk), .reset(reset),
.in(ft5 & f_c_e),
.p(ft6));
pa f_pa9(.clk(clk), .reset(reset),
.in(ft5 & f_c_e_pse),
.p(ft7));
pa f_pa10(.clk(clk), .reset(reset),
.in(f6a & mc_rs_t1 |
ft5 & ~f_c_e_OR_pse),
.p(ft6a));
wire ft1a_D, ft3_D, ft4a_D;
dly100ns f_dly0(.clk(clk), .reset(reset),
.in(ft1a),
.p(ft1a_D));
dly100ns f_dly1(.clk(clk), .reset(reset),
.in(ft3),
.p(ft3_D));
dly100ns f_dly2(.clk(clk), .reset(reset),
.in(ft4a),
.p(ft4a_D));
always @(posedge clk) begin
if(mr_clr | ft1a)
f1a <= 0;
if(ft1)
f1a <= 1;
if(mr_clr | ft4a)
f4a <= 0;
if(ft4)
f4a <= 1;
if(mr_clr | ft6a)
f6a <= 0;
if(ft6 | ft7)
f6a <= 1;
end
/*
* E
*/
reg et4_ar_pse;
wire et0a;
wire et0;
wire et1;
wire et3;
wire et4;
wire et5;
wire et6;
wire et7;
wire et8;
wire et9;
wire et10;
wire et4_inh = ir_blt | ir_xct | ex_ir_uuo |
shift_op | ar_sbr | ir_md | ir_fpch;
wire et5_inh = ir_iot | ir_fsb;
wire e_long = iot_consz | ir_jp | ir_acbm | pc_set |
mb_pc_sto | pc_inc_et9 | iot_conso | ir_accp_OR_memac;
pa e_pa0(.clk(clk), .reset(reset),
.in(ft6a),
.p(et0a));
pa e_pa1(.clk(clk), .reset(reset),
.in(ft6a),
.p(et0));
pa e_pa2(.clk(clk), .reset(reset),
.in(ft6a_D),
.p(et1));
pa e_pa3(.clk(clk), .reset(reset),
.in(et1_D),
.p(et3));
pa e_pa4(.clk(clk), .reset(reset),
.in(et3 & ~et4_inh |
ar_t3 & et4_ar_pse),
.p(et4));
pa e_pa5(.clk(clk), .reset(reset),
.in(et4_D & ~et5_inh | iot_t3_D),
.p(et5));
pa e_pa6(.clk(clk), .reset(reset),
.in(et5_D & e_long),
.p(et6));
pa e_pa7(.clk(clk), .reset(reset),
.in(et6_D),
.p(et7));
pa e_pa8(.clk(clk), .reset(reset),
.in(et7_D),
.p(et8));
pa e_pa9(.clk(clk), .reset(reset),
.in(et8_D | dst21a & ir_div),
.p(et9));
pa e_pa10(.clk(clk), .reset(reset),
.in(et9_D | et5 & ~e_long |
lct0a | dct3 |
nrt6 | fst0a | sht1a |
blt_t5a & blt_done),
.p(et10));
wire ft6a_D, et1_D, et4_D, et5_D;
wire et6_D, et7_D, et8_D, et9_D;
wire iot_t3_D;
dly100ns e_dly0(.clk(clk), .reset(reset),
.in(ft6a),
.p(ft6a_D));
dly100ns e_dly1(.clk(clk), .reset(reset),
.in(et1),
.p(et1_D));
dly200ns e_dly2(.clk(clk), .reset(reset),
.in(iot_t3),
.p(iot_t3_D));
dly100ns e_dly3(.clk(clk), .reset(reset),
.in(et4),
.p(et4_D));
dly100ns e_dly4(.clk(clk), .reset(reset),
.in(et5),
.p(et5_D));
dly100ns e_dly5(.clk(clk), .reset(reset),
.in(et6),
.p(et6_D));
dly100ns e_dly6(.clk(clk), .reset(reset),
.in(et7),
.p(et7_D));
dly200ns e_dly7(.clk(clk), .reset(reset),
.in(et8),
.p(et8_D));
dly200ns e_dly8(.clk(clk), .reset(reset),
.in(et9),
.p(et9_D));
always @(posedge clk) begin
if(et3 & ar_sbr)
et4_ar_pse <= 1;
if(mr_clr | et4)
et4_ar_pse <= 0;
end
/*
* S
*/
reg sf3;
reg sf5a;
reg sf7;
wire st1;
wire st2;
wire st3;
wire st3a;
wire st5;
wire st5a;
wire st6;
wire st6a;
wire st7;
wire s_c_e = jp_pushj | jp_push | jp_pop | jp_jsr | jp_jsa |
iot_datai | iot_coni | fwt_10 | ir_md_s_c_e |
ir_fp_mem | ir_fp_both;
wire s_ac_inh_if_ac_0 = s_ac_0 & (fwt_11 | hwt_11 | memac_mem);
wire s_ac_inh = boole_as_10 | hwt_10 | blt_last |
accp | jp_jsr | fwt_10 |
acbm_dn | ir_iot | ir_md_s_ac_inh |
ch_dep | ir_fp_mem | ir_254_7 |
s_ac_inh_if_ac_0;
wire s_ac_2 = sh_ac_2 | ir_fp_rem | ir_md_s_ac_2;
wire s_ac_0 = ir[9:12] == 0;
pa s_pa0(.clk(clk), .reset(reset),
.in(et10 & s_c_e),
.p(st1));
pa s_pa1(.clk(clk), .reset(reset),
.in(et10 & f_c_e_pse),
.p(st2));
pa s_pa2(.clk(clk), .reset(reset),
.in(mc_rs_t1 & sf3 |
et10 & ~f_c_e_pse & ~s_c_e),
.p(st3));
pa s_pa3(.clk(clk), .reset(reset),
.in(st3 & ~s_ac_inh),
.p(st3a));
pa s_pa4(.clk(clk), .reset(reset),
.in(st3a_D),
.p(st5));
pa s_pa5(.clk(clk), .reset(reset),
.in(mc_rs_t1 & sf5a),
.p(st5a));
pa s_pa6(.clk(clk), .reset(reset),
.in(st5a & s_ac_2),
.p(st6));
pa s_pa7(.clk(clk), .reset(reset),
.in(st6_D),
.p(st6a));
pa s_pa8(.clk(clk), .reset(reset),
.in(st3 & s_ac_inh |
st5a & ~s_ac_2 |
cht8b & ir_cao |
dst13 |
mc_illeg_address_D |
et3 & ir_fpch & ~ir[3] &
(ir_130 | ir_131 | ~ir[4] | ~ir[5])),
.p(st7));
wire st3a_D, st6_D, mc_illeg_address_D;
dly100ns s_dly0(.clk(clk), .reset(reset),
.in(st3a),
.p(st3a_D));
dly50ns s_dly1(.clk(clk), .reset(reset),
.in(st6),
.p(st6_D));
dly100ns s_dly2(.clk(clk), .reset(reset),
.in(mc_illeg_address),
.p(mc_illeg_address_D));
always @(posedge clk) begin
if(mr_clr | st3)
sf3 <= 0;
if(st1 | st2)
sf3 <= 1;
if(mr_clr | st5a)
sf5a <= 0;
if(st5)
sf5a <= 1;
if(mr_clr | st7)
sf7 <= 0;
if(st6a)
sf7 <= 1;
end
/*
* IR
*/
// reg [0:17] ir;
assign iobus_ios = ir[3:9];
wire ir0_12_clr = mr_clr;
wire ir13_17_clr = mr_clr | at5_D | cht8a;
wire ir0_12_fm_mb1 = it1a;
wire ir13_17_fm_mb1 = at0;
always @(posedge clk) begin
if(ir0_12_clr)
ir[0:12] <= 0;
if(ir13_17_clr)
ir[13:17] <= 0;
if(ir0_12_fm_mb1)
ir[0:12] <= ir[0:12] | mb[0:12];
if(ir13_17_fm_mb1)
ir[13:17] <= ir[13:17] | mb[13:17];
if(iot_t0a)
ir[12] <= 1;
end
wire ir_uuo_a = ir[0:2] == 0;
wire ir_fpch = ir[0:2] == 1;
wire ir_2xx = ir[0:2] == 2;
wire ir_accp_OR_memac = ir[0:2] == 3;
wire ir_boole = ir[0:2] == 4;
wire ir_hwt = ir[0:2] == 5;
wire ir_acbm = ir[0:2] == 6;
wire ir_iot_a = ir[0:2] == 7;
wire ir_130 = ir[0:8] == 9'o130;
wire ir_131 = ir[0:8] == 9'o131;
wire ir_fsc = ir[0:8] == 9'o132;
wire ir_cao = ir[0:8] == 9'o133;
wire ir_ldci = ir[0:8] == 9'o134;
wire ir_ldc = ir[0:8] == 9'o135;
wire ir_dpci = ir[0:8] == 9'o136;
wire ir_dpc = ir[0:8] == 9'o137;
wire ir_fwt_mov_s = ir_2xx & ir[3:5] == 0;
wire ir_fwt_movn_m = ir_2xx & ir[3:5] == 1;
wire ir_fwt = ir_fwt_mov_s | ir_fwt_movn_m;
wire ir_mul = ir_2xx & ir[3:5] == 2;
wire ir_div = ir_2xx & ir[3:5] == 3;
wire ir_sh = ir_2xx & ir[3:5] == 4;
wire ir_25x = ir_2xx & ir[3:5] == 5;
wire ir_jp = ir_2xx & ir[3:5] == 6;
wire ir_as = ir_2xx & ir[3:5] == 7;
wire ir_ash = ir_sh & ir[6:8] == 0;
wire ir_rot = ir_sh & ir[6:8] == 1;
wire ir_lsh = ir_sh & ir[6:8] == 2;
wire ir_243 = ir_sh & ir[6:8] == 3;
wire ir_ashc = ir_sh & ir[6:8] == 4;
wire ir_rotc = ir_sh & ir[6:8] == 5;
wire ir_lshc = ir_sh & ir[6:8] == 6;
wire ir_247 = ir_sh & ir[6:8] == 7;
wire ir_exch = ir_25x & ir[6:8] == 0;
wire ir_blt = ir_25x & ir[6:8] == 1;
wire ir_aobjp = ir_25x & ir[6:8] == 2;
wire ir_aobjn = ir_25x & ir[6:8] == 3;
wire ir_jrst_a = ir_25x & ir[6:8] == 4;
wire ir_jfcl = ir_25x & ir[6:8] == 5;
wire ir_xct = ir_25x & ir[6:8] == 6;
wire ir_257 = ir_25x & ir[6:8] == 7;
wire ir_ash_OR_ashc = ir_ash | ir_ashc;
wire ir_md = ir_2xx & ir[3:4] == 1;
wire ir_md_s_c_e = ir_md & ir[7];
wire ir_md_f_c_e = ir_md & (ir[7] | ~ir[8]);
wire ir_md_s_ac_inh = ir_md & ir[7:8] == 2;
wire ir_md_f_ac_2 = ir_div & ir[6];
wire ir_md_s_ac_2 = (ir_div | ir_mul & ir[6]) & ~ir_md_s_ac_inh;
wire ir_254_7 = ir_25x & ir[6];
wire ir_iot = ir_iot_a & ~ex_ir_uuo;
wire ir_jrst = ir_jrst_a & ~ex_ir_uuo;
wire ir_9_OR_10 = ir[9] | ir[10];
wire ir_fp = ir_fpch & ir[3];
wire ir_fp_dir = ir_fp & ir[7:8] == 0;
wire ir_fp_rem = ir_fp & ir[7:8] == 1;
wire ir_fp_mem = ir_fp & ir[7:8] == 2;
wire ir_fp_both = ir_fp & ir[7:8] == 3;
wire ir_fad = ir_fp & ir[4:5] == 0;
wire ir_fsb = ir_fp & ir[4:5] == 1;
wire ir_fmp = ir_fp & ir[4:5] == 2;
wire ir_fdv = ir_fp & ir[4:5] == 3;
wire ir14_17_eq_0 = ir[14:17] == 0;
/* ACCP V MEM AC */
wire accp = ir_accp_OR_memac & ir[3:4] == 0;
wire memac_tst = ir_accp_OR_memac & ir[3:4] == 1;
wire memac_inc = ir_accp_OR_memac & ir[3:4] == 2;
wire memac_dec = ir_accp_OR_memac & ir[3:4] == 3;
wire memac = memac_tst | memac_inc | memac_dec;
wire memac_mem = memac & ir[5];
wire memac_ac = memac & ~ir[5];
wire accp_etc_cond = ir_accp_OR_memac & ir[8] & ar0_xor_ar_ov |
ir[7] & ar_eq_0;
wire accp_etal_test = accp_etc_cond ^ ir[6];
wire accp_dir = accp & ir[5];
/* ACBM */
wire acbm_swap = ir_acbm & ir[8];
wire acbm_dir = ir_acbm & ir[5];
wire acbm_dn = ir_acbm & ir[3:4] == 0;
wire acbm_cl = ir_acbm & ir[3:4] == 1;
wire acbm_com = ir_acbm & ir[3:4] == 2;
wire acbm_set = ir_acbm & ir[3:4] == 3;
/* FWT */
wire fwt_swap = ir_fwt & ir[5:6] == 1;
wire fwt_negate = ir_fwt_movn_m & (ir[6] | ar[0]);
wire fwt_00 = ir_fwt & ir[7:8] == 0;
wire fwt_01 = ir_fwt & ir[7:8] == 1;
wire fwt_10 = ir_fwt & ir[7:8] == 2;
wire fwt_11 = ir_fwt & ir[7:8] == 3;
/* HWT */
wire hwt_lt_set = hwt_rt & ir[4] & (~ir[5] | mb[18]);
wire hwt_rt_set = hwt_lt & ir[4] & (~ir[5] | mb[0]);
wire hwt_lt = ir_hwt & ~ir[3];
wire hwt_rt = ir_hwt & ir[3];
wire hwt_swap = ir_hwt & ir[6];
wire hwt_ar_clr = ir_hwt & (ir[4] | ir[5]);
wire hwt_00 = ir_hwt & ir[7:8] == 0;
wire hwt_01 = ir_hwt & ir[7:8] == 1;
wire hwt_10 = ir_hwt & ir[7:8] == 2;
wire hwt_11 = ir_hwt & ir[7:8] == 3;
/* BOOLE */
wire boole_as_00 = (ir_boole | ir_as) & ir[7:8] == 0;
wire boole_as_01 = (ir_boole | ir_as) & ir[7:8] == 1;
wire boole_as_10 = (ir_boole | ir_as) & ir[7:8] == 2;
wire boole_as_11 = (ir_boole | ir_as) & ir[7:8] == 3;
wire boole_0 = ir_boole & ir[3:6] == 0;
wire boole_1 = ir_boole & ir[3:6] == 1;
wire boole_2 = ir_boole & ir[3:6] == 2;
wire boole_3 = ir_boole & ir[3:6] == 3;
wire boole_4 = ir_boole & ir[3:6] == 4;
wire boole_5 = ir_boole & ir[3:6] == 5;
wire boole_6 = ir_boole & ir[3:6] == 6;
wire boole_7 = ir_boole & ir[3:6] == 7;
wire boole_10 = ir_boole & ir[3:6] == 8;
wire boole_11 = ir_boole & ir[3:6] == 9;
wire boole_12 = ir_boole & ir[3:6] == 10;
wire boole_13 = ir_boole & ir[3:6] == 11;
wire boole_14 = ir_boole & ir[3:6] == 12;
wire boole_15 = ir_boole & ir[3:6] == 13;
wire boole_16 = ir_boole & ir[3:6] == 14;
wire boole_17 = ir_boole & ir[3:6] == 15;
/* JUMP V PUSH */
wire jp_pushj = ir_jp & ir[6:8] == 0;
wire jp_push = ir_jp & ir[6:8] == 1;
wire jp_pop = ir_jp & ir[6:8] == 2;
wire jp_popj = ir_jp & ir[6:8] == 3;
wire jp_jsr = ir_jp & ir[6:8] == 4;
wire jp_jsp = ir_jp & ir[6:8] == 5;
wire jp_jsa = ir_jp & ir[6:8] == 6;
wire jp_jra = ir_jp & ir[6:8] == 7;
wire jp_flag_stor = jp_pushj | jp_jsr | jp_jsp;
wire jp_AND_NOT_jsr = ir_jp & ~jp_jsr;
wire jp_AND_ir6_0 = ir_jp & ~ir[6];
wire jp_jmp = ir_jp & ~jp_push & ~jp_pop;
/* AS */
wire as_plus = ir_as & ~ir[6];
wire as_minus = ir_as & ir[6];
/* XCT */
wire xct_t0;
pa xct_pa0(.clk(clk), .reset(reset),
.in(et3 & ir_xct),
.p(xct_t0));
wire xct_t0_D;
dly200ns xct_dly0(.clk(clk), .reset(reset),
.in(xct_t0),
.p(xct_t0_D));
/*
* UUO
*/
reg uuo_f1;
wire uuo_t1;
wire uuo_t2;
pa uuo_pa0(.clk(clk), .reset(reset),
.in(uuo_f1 & mc_rs_t1),
.p(uuo_t1));
pa uuo_pa1(.clk(clk), .reset(reset),
.in(uuo_t1_D),
.p(uuo_t2));
wire uuo_t1_D;
dly100ns uuo_dly0(.clk(clk), .reset(reset),
.in(uuo_t1),
.p(uuo_t1_D));
always @(posedge clk) begin
if(mr_clr | uuo_t1)
uuo_f1 <= 0;
if(mblt_fm_ir1_uuo_t0)
uuo_f1 <= 1;
end
/*
* PC
*/
// reg [18:35] pc;
wire pc_clr = et7 & pc_set | kt1 & key_start_OR_read_in;
wire pc_fm_ma1 = et8 & pc_set | kt3 & key_start_OR_read_in;
wire pc_inc = et0 & ~pc_inc_inh_et0 |
blt_t5a & ~mq[0] |
et9 & pc_inc_et9 |
iot_t0a & ~ar_cry0 & ~pi_cyc;
wire pc_set = pc_set_enable | jp_jmp | ir_jrst;
wire pc_inc_et9 = jp_jsr | jp_jsa | pc_inc_enable;
wire pc_inc_inh_et0 = key_execute |
~ir_cao & (ch_NOT_inc_op | ch_inc_op) |
ir_xct | ex_ir_uuo | pi_cyc | iot_blk | ir_blt;
wire pc_inc_enable = memac_mem & accp_etal_test |
accp & accp_etal_test |
ir_acbm & accp_etal_test |
iot_conso & ~ar_eq_0 |
iot_consz & ar_eq_0;
wire selected_flag = ar_ov_flag & ir[9] |
ar_cry0 & ir[10] |
ar_cry1 & ir[11] |
ar_pc_chg_flag & ir[12];
wire pc_set_enable = memac_ac & accp_etal_test |
ir_aobjn & ar[0] |
ir_aobjp & ~ar[0] |
ir_jfcl & selected_flag;
wire pc_set_OR_pc_inc = pc_set | pc_inc_et9;
always @(posedge clk) begin
if(pc_clr)
pc <= 0;
if(pc_inc)
pc <= pc + 18'b1;
if(pc_fm_ma1)
pc <= pc | ma;
end
/*
* EX
*/
reg ex_user;
reg ex_mode_sync;
reg ex_uuo_sync;
reg ex_pi_sync;
reg ex_ill_op;
wire ex_clr = mr_start | cpa & iobus_datao_clear;
wire ex_set = cpa & iobus_datao_set;
wire ex_ir_uuo = ir_jrst_a & ir_9_OR_10 & ex_user |
ir_iot_a & ~ex_pi_sync & ex_user & ~cpa_iot_user |
ex_uuo_sync & ir_uuo_a;
wire ex_inh_rel = ~ex_user | ex_pi_sync | ma18_31_eq_0 | ex_ill_op;
always @(posedge clk) begin
if(mr_start | et7 & jp_jsr & (ex_pi_sync | ex_ill_op))
ex_user <= 0;
if(mr_clr) begin
if(ex_mode_sync)
ex_user <= 1;
ex_mode_sync <= 0;
ex_uuo_sync <= 0;
ex_pi_sync <= 0;
end
if(et1 & ir_jrst & ir[12] |
ar_flag_set & mb[5])
ex_mode_sync <= 1;
if(at1)
ex_uuo_sync <= 1;
if(pi_cyc)
ex_pi_sync <= 1;
if(mr_start | et8 & jp_jsr | et4 & iot_blk)
ex_ill_op <= 0;
if(et1 & ex_ir_uuo)
ex_ill_op <= 1;
end
/*
* MB
*/
// reg [0:35] mb;
wire mblt_clr = et1 & ex_ir_uuo | mb_clr;
wire mblt_fm_ar0 = mb_fm_arJ | mb_ar_swap | mb_fm_ar0 | cfac_mb_ar_swap;
wire mblt_fm_ar1 = mb_fm_arJ | mb_ar_swap | cfac_mb_ar_swap;
wire mblt_fm_mq0 = cfac_mb_mq_swap | cfac_mb_fm_mqJ | mb_fm_mqJ;
wire mblt_fm_mq1 = cfac_mb_mq_swap | cfac_mb_fm_mqJ | mb_fm_mqJ;
wire mblt_fm_mbrtJ = mblt_mbrt_swap;
wire mb_fm_ir1 = mblt_fm_ir1_uuo_t0;
wire mbrt_clr = mb_clr;
wire mbrt_fm_ar0 = mb_fm_arJ | mb_ar_swap | mb_fm_ar0 | cfac_mb_ar_swap;
wire mbrt_fm_ar1 = mb_fm_arJ | mb_ar_swap | cfac_mb_ar_swap;
wire mbrt_fm_mq0 = cfac_mb_mq_swap | cfac_mb_fm_mqJ | mb_fm_mqJ;
wire mbrt_fm_mq1 = cfac_mb_mq_swap | cfac_mb_fm_mqJ | mb_fm_mqJ;
wire mbrt_fm_mbltJ = mblt_mbrt_swap;
wire mb_fm_pc1 = mb_fm_pc1_init;
wire mb_clr = et5 & mb_pc_sto |
mc_mb_clr_D;
wire mblt_mbrt_swap = et0a & mbltrtJ_et0 |
et1 & mbltrtJ_et1 |
ft1a & f_c_c_aclt;
wire mbltrtJ_et0 = acbm_swap | iot_cono | jp_jsa;
wire mbltrtJ_et1 = hwt_swap | fwt_swap | ir_blt;
wire mb_fm_misc_bits1 = et6 & jp_flag_stor;
wire mb_fm_ar0 = et1 & mb_fm_ar0_et1 |
dct3 |
et6 & acbm_cl;
wire mb_fm_ar0_et1 = ir_acbm;
wire mb_fm_arJ = at3a | st5 | key_wr | dst1 | mst1 |
et0a & mb_fm_arJ_et0 |
et10 & mb_fm_arJ_et10 |
kt3 & key_execute;
wire mb_fm_arJ_et0 = fwt_01 | fwt_10 | iot_status;
wire mb_fm_arJ_et10 = (f_c_e_pse | s_c_e) & ~mb_fm_arJ_inh_et10;
wire mb_fm_arJ_inh_et10 = ir_jp | ir_exch | ch_dep;
wire mb_ar_swap = ft3 | blt_t1 | blt_t4 | blt_t6 |
et0a & mb_ar_swap_et0 |
et4 & mb_ar_swap_et4 |
et9 & mb_ar_swap_et9 |
et10 & mb_ar_swap_et10 |
ft1a & ~f_c_c_aclt_OR_rt;
wire mb_ar_swap_et0 = hwt_10 | jp_jsp | ir_exch | ir_blt | ir_fsb;
wire mb_ar_swap_et4 = fwt_swap | iot_blk | ir_acbm;
wire mb_ar_swap_et9 = ir_acbm | jp_AND_NOT_jsr;
wire mb_ar_swap_et10 = jp_AND_ir6_0;
wire mb_fm_mqJ = st6 | ft4a | blt_t0a |
et0a & mb_fm_mqJ_et0;
wire mb_fm_mqJ_et0 = jp_pop | jp_popj | jp_jra;
wire mb1_8_clr = (fpt3 | fat8a) & ~mb[0];
wire mb1_8_set = (fpt3 | fat8a) & mb[0];
wire mblt_fm_ir1_uuo_t0 = et3 & ex_ir_uuo;
wire mb_fm_pc1_init = et6 & mb_pc_sto |
et6 & mb_fm_pc1_et6;
wire mb_pc_sto = jp_pushj | jp_jsr | jp_jsp | ir_jrst;
wire mb_fm_pc1_et6 = jp_jsa;
wire mc_mb_clr_D;
dly100ns mb_dly0(.clk(clk), .reset(reset), .in(mc_mb_clr), .p(mc_mb_clr_D));
wire membus_mb_pulse;
pg mb_pg0(.clk(clk), .reset(reset), .in(| membus_mb_in), .p(membus_mb_pulse));
always @(posedge clk) begin: mbctl
integer i;
if(mblt_clr)
mb[0:17] <= 0;
if(mbrt_clr)
mb[18:35] <= 0;
for(i = 0; i < 18; i = i+1) begin
if(mblt_fm_ar0 & ~ar[i])
mb[i] <= 0;
if(mblt_fm_ar1 & ar[i])
mb[i] <= 1;
if(mbrt_fm_ar0 & ~ar[i+18])
mb[i+18] <= 0;
if(mbrt_fm_ar1 & ar[i+18])
mb[i+18] <= 1;
end
for(i = 0; i < 18; i = i+1) begin
if(mblt_fm_mq0 & ~mq[i])
mb[i] <= 0;
if(mblt_fm_mq1 & mq[i])
mb[i] <= 1;
if(mbrt_fm_mq0 & ~mq[i+18])
mb[i+18] <= 0;
if(mbrt_fm_mq1 & mq[i+18])
mb[i+18] <= 1;
end
if(mblt_fm_mbrtJ)
mb[0:17] <= mb[18:35];
if(mbrt_fm_mbltJ)
mb[18:35] <= mb[0:17];
if(mb_fm_pc1)
mb[0:17] <= mb[0:17] | pc;
if(mb_fm_ir1)
mb[18:35] <= mb[18:35] | ir;
if(mb1_8_clr)
mb[1:8] <= 0;
if(mb1_8_set)
mb[1:8] <= 1;
if(mb_fm_misc_bits1) begin
if(ar_ov_flag) mb[0] <= 1;
if(ar_cry0_flag) mb[1] <= 1;
if(ar_cry1_flag) mb[2] <= 1;
if(ar_pc_chg_flag) mb[3] <= 1;
if(chf7) mb[4] <= 1;
if(ex_user) mb[5] <= 1;
end
if(membus_mb_pulse & mc_mb_membus_enable)
mb <= mb | membus_mb_in;
end
/*
* AR
*/
// reg [0:35] ar;
reg ar_com_cont;
reg ar_pc_chg_flag;
reg ar_ov_flag;
reg ar_cry0_flag;
reg ar_cry1_flag;
reg ar_cry0;
reg ar_cry1;
wire arlt_clr = ar_clr | at4 | blt_t2 | key_ar_clr;
wire arlt_com = ar_com | ar_as_t0 | cfac_ar_com | et4 & hwt_lt_set;
wire arlt_fm_mb_xor = ar_as_t1 | ar_fm_mb_xor;
wire arlt_fm_mb0 = cfac_mb_ar_swap | mb_ar_swap | ar_fm_mbJ | ar_fm_mb0 |
et4 & ar_fm_mbltJ_et4;
wire arlt_fm_mb1 = cfac_mb_ar_swap | mb_ar_swap | ar_fm_mbJ | ar_fm_mb1 |
et4 & ar_fm_mbltJ_et4;
wire arlt_fm_datasw1 = key_ar_fm_datasw1;
wire arlt_fm_iob1 = iot_t3;
wire arrt_clr = ar_clr | key_ar_clr;
wire arrt_com = ar_com | ar_as_t0 | cfac_ar_com | et4 & hwt_rt_set;
wire arrt_fm_mb_xor = ar_as_t1 | ar_fm_mb_xor;
wire arrt_fm_mb0 = cfac_mb_ar_swap | mb_ar_swap | ar_fm_mbJ | ar_fm_mb0 |
et4 & ar_fm_mbrtJ_et4 | at0;
wire arrt_fm_mb1 = cfac_mb_ar_swap | mb_ar_swap | ar_fm_mbJ | ar_fm_mb1 |
et4 & ar_fm_mbrtJ_et4 | at0;
wire arrt_fm_datasw1 = key_ar_fm_datasw1;
wire arrt_fm_iob1 = iot_t3;
// just one for simplicity
wire ar_shlt = cfac_ar_sh_lt;
wire ar_shrt = cfac_ar_sh_rt;
wire ar_cry_initiate = ar_as_t2;
wire ar0_shl_inp = ~ir_ash & ~shc_ashc ? ar[1] : ar[0];
wire ar0_shr_inp = ir_rotc ? mq[35] :
ir_rot ? ar[35] :
(ir_ash | shc_ashc | ms_mult | ir_fdv) ? ar[0] :
ir_div ? ~mq[35] :
ch_load | ir_lsh | ir_lshc ? 1'b0 :
1'b0; // shouldn't happen
wire ar35_shl_inp = ir_rot ? ar[0] :
shc_ashc ? mq[1] :
ir_rotc | shc_lshc_OR_div ? mq[0] :
ch_dep | ir_lsh | ir_ash ? 1'b0 :
1'b0; // shouldn't happen
wire shc_ashc = ir_ashc | nrf2 | faf3;
wire shc_lshc_OR_div = ir_lshc | shc_div;
wire shc_div = (ir_div | ir_fdv) & ~nrf2;
wire ar_clr = dst2 | fat6 |
et0a & ar_clr_et0 |
et1 & ar_clr_et1 |
mst1_D0;
wire ar_clr_et0 = boole_0 | boole_3 | boole_14 | boole_17;
wire ar_clr_et1 = hwt_ar_clr | iot_status | iot_datai;
wire ar_com = ar_incdec_t0 | ar_negate_t0 |
et0a & ar_com_et0 |
et4 & ar_com_et4 |
et5 & ar_com_et5 |
et7 & ar_com_et7 |
ar_cry_comp & ar_com_cont;
wire ar_com_et0 = boole_2 | boole_4 |
boole_12 | boole_13 | boole_15;
wire ar_com_et4 = boole_4 | boole_10 | boole_11 | boole_14 |
boole_15 | boole_16 | boole_17;
wire ar_com_et5 = ir_acbm;
wire ar_com_et7 = ir_acbm;
wire ar_fm_mb0 = dct1 | lct0a |
et1 & ar_fm_mb0_et1 |
et6 & ar_fm_mb0_et6;
wire ar_fm_mb0_et1 = boole_3 | boole_4 | boole_7 |
boole_10 | boole_13 | acbm_set;
wire ar_fm_mb0_et6 = iot_consz | iot_conso;
wire ar_fm_mb1 = et1 & ar_fm_mb1_et1;
wire ar_fm_mb1_et1 = boole_6 | boole_11 | boole_14 | acbm_com;
wire ar_fm_mb_xor = et1 & ar_fm_mb_xor_et1;
wire ar_fm_mb_xor_et1 = boole_14 | boole_6 | boole_11 | acbm_com;
wire ar_fm_mbJ = cht1 | lct0 | mpt2 |
et0a & ar_fm_mbJ_et0;
wire ar_fm_mbJ_et0 = hwt_11 | fwt_00 | fwt_11 |
memac_mem | iot_blk | iot_datao;
wire ar_fm_mbltJ_et4 = hwt_lt | iot_cono;
wire ar_fm_mbrtJ_et4 = hwt_rt;
wire ar_incdec_t0;
wire ar_negate_t0;
wire ar_incdec_t1;
// these two are a bit of a hack
wire ar35_cry_in = ar_incdec_t1;
wire ar17_cry_in = ar_incdec_t1 & (ar_incdec_lt_rt | ir_blt);
wire ar_as_t0;
wire ar_as_t1;
wire ar_as_t2;
wire ar_t3;
wire ar_cry_comp;
wire ar1_8_clr = (fpt3 | fat5) & ~ar[0];
wire ar1_8_set = (fpt3 | fat5) & ar[0];
wire ar_fm_sc1_8J = nrt4 | fst0a;
wire ar0_5_fm_sc3_8J = cht6 & ch_inc_op;
wire ar_add = as_plus;
wire ar_sub = as_minus | accp;
wire ar_inc = memac_inc | jp_push | jp_pushj | iot_blk |
ir_aobjp | ir_aobjn;
wire ar_incdec_lt_rt = iot_blk | ir_aobjp | ir_aobjn | jp_AND_ir6_0;
wire ar_dec = memac_dec | jp_pop | jp_popj;
wire ar_sbr = fwt_negate | ar_add | ar_sub | ar_inc | ar_dec | ir_fsb;
wire ar_flag_clr = mr_start | et0 & ir_jrst & ir[11];
wire ar_jrst_AND_ir11 = ir_jrst & ir[11];
wire ar_flag_set = et1 & ar_jrst_AND_ir11;
wire ar_jfcl_clr = et10 & ir_jfcl;
wire ar_eq_fp_half = ar == 36'o000400000000;
wire ar_eq_0 = ar == 0;
wire ar0_xor_ar1 = ar[0] ^ ar[1];
wire ar_ov_set = ar_cry0 ^ ar_cry1;
wire ar_cry0_xor_cry1 = ar_ov_set & ~memac;
wire ar0_xor_ar_ov = ar[0] ^ ar_cry0_xor_cry1;
wire ar0_xor_mb0 = ar[0] ^ mb[0];
wire ar0_eq_sc0 = ar[0] == sc[0];
wire set_flags_et10 = et10 & (memac | ir_as);
pa ar_pa0(.clk(clk), .reset(reset),
.in(et3 & ar_dec),
.p(ar_incdec_t0));
pa ar_pa1(.clk(clk), .reset(reset),
.in(et3 & fwt_negate |
et3 & ir_fsb |
cfac_ar_negate),
.p(ar_negate_t0));
pa ar_pa2(.clk(clk), .reset(reset),
.in(ar_incdec_t0_D |
ar_negate_t0_D |
et3 & ar_inc |
blt_t5 | nrt5 | cht4),
.p(ar_incdec_t1));
pa ar_pa3(); // AR17 CRY IN
pa ar_pa4(.clk(clk), .reset(reset),
.in(et3 & ar_sub |
cfac_ar_sub |
blt_t3),
.p(ar_as_t0));
pa ar_pa5(.clk(clk), .reset(reset),
.in(ar_as_t0_D | et3 & ar_add |
at3 | cfac_ar_add),
.p(ar_as_t1));
pa ar_pa6(.clk(clk), .reset(reset),
.in(ar_as_t1_D),
.p(ar_as_t2));
pa ar_pa7(.clk(clk), .reset(reset),
.in(ar_as_t2 | ar_incdec_t1 | ar17_cry_in),
.p(ar_cry_comp));
pa ar_pa8(.clk(clk), .reset(reset),
.in(ar_cry_comp & ~ar_com_cont |
ar_cry_comp_D & ar_com_cont),
.p(ar_t3));
wire ar_incdec_t0_D, ar_negate_t0_D;
wire ar_as_t0_D, ar_as_t1_D, ar_cry_comp_D;
dly100ns ar_dly0(.clk(clk), .reset(reset),
.in(ar_incdec_t0),
.p(ar_incdec_t0_D));
dly100ns ar_dly1(.clk(clk), .reset(reset),
.in(ar_negate_t0),
.p(ar_negate_t0_D));
dly100ns ar_dly2(.clk(clk), .reset(reset),
.in(ar_as_t0),
.p(ar_as_t0_D));
dly100ns ar_dly3(.clk(clk), .reset(reset),
.in(ar_as_t1),
.p(ar_as_t1_D));
dly100ns ar_dly4(.clk(clk), .reset(reset),
.in(ar_cry_comp),
.p(ar_cry_comp_D));
wire [0:35] ar_mb_cry = mb & ~ar;
wire [0:35] ar_cry_in = ar_cry_initiate ? { mb[1:35]&~ar[1:35], 1'b0 } :
ar35_cry_in & ar17_cry_in ? 36'o000001000001 :
ar35_cry_in ? 36'o000000000001 :
ar17_cry_in ? 36'o000001000000 :
36'b0;
// hold the cry out temporarily
reg cry0, cry1;
always @(posedge clk) begin: arctl
integer i;
if(arlt_clr)
ar[0:17] <= 0;
if(arrt_clr)
ar[18:35] <= 0;
if(ar_cry_in) begin
cry1 <= (ar[1:35] + ar_cry_in[1:35]) + 36'o0 >> 35;
{cry0, ar} <= ar + ar_cry_in;
end
if(arlt_com)
ar[0:17] <= ~ar[0:17];
if(arrt_com)
ar[18:35] <= ~ar[18:35];
if(arlt_fm_mb_xor)
ar[0:17] <= ar[0:17] ^ mb[0:17];
if(arrt_fm_mb_xor)
ar[18:35] <= ar[18:35] ^ mb[18:35];
for(i = 0; i < 18; i = i+1) begin
if(arlt_fm_mb0 & ~mb[i])
ar[i] <= 0;
if(arlt_fm_mb1 & mb[i])
ar[i] <= 1;
if(arrt_fm_mb0 & ~mb[i+18])
ar[i+18] <= 0;
if(arrt_fm_mb1 & mb[i+18])
ar[i+18] <= 1;
end
if(ar_shlt)
ar <= { ar0_shl_inp, ar[2:35], ar35_shl_inp };
if(ar_shrt)
ar <= { ar0_shr_inp, ar[0:34] };
if(arlt_fm_datasw1)
ar[0:17] <= ar[0:17] | datasw[0:17];
if(arrt_fm_datasw1)
ar[18:35] <= ar[18:35] | datasw[18:35];
if(arlt_fm_iob1)
ar[0:17] <= ar[0:17] | iob[0:17];
if(arrt_fm_iob1)
ar[18:35] <= ar[18:35] | iob[18:35];
if(ar1_8_clr)
ar[1:8] <= 0;
if(ar1_8_set)
ar[1:8] <= 8'o377;
if(ar_fm_sc1_8J)
ar[1:8] <= sc[1:8];
if(ar0_5_fm_sc3_8J)
ar[0:5] <= sc[3:8];
if(mr_clr | ar_t3)
ar_com_cont <= 0;
if(ar_as_t0 | ar_incdec_t0)
ar_com_cont <= 1;
if(ar_flag_clr) begin
ar_pc_chg_flag <= 0;
ar_ov_flag <= 0;
ar_cry0_flag <= 0;
ar_cry1_flag <= 0;
end
// Flags
if(ar_jfcl_clr & ir[12] |
cpa_cono_set & iob[29])
ar_pc_chg_flag <= 0;
if(ar_flag_set & mb[3] |
et9 & pc_set_OR_pc_inc & ~ar_jrst_AND_ir11)
ar_pc_chg_flag <= 1;
if(ar_jfcl_clr & ir[9] |
cpa_cono_set & iob[32])
ar_ov_flag <= 0;
if(ar_flag_set & mb[0] |
set_flags_et10 & ar_ov_set |
cfac_overflow |
et10 & ir_fwt & ~ar_cry0 & ar_cry1 |
sct1 & ~mb[18] & ir_ash_OR_ashc & ar0_xor_ar1)
ar_ov_flag <= 1;
if(ar_jfcl_clr & ir[10])
ar_cry0_flag <= 0;
if(ar_flag_set & mb[1] |
set_flags_et10 & ar_cry0)
ar_cry0_flag <= 1;
if(ar_jfcl_clr & ir[11])
ar_cry1_flag <= 0;
if(ar_flag_set & mb[2] |
set_flags_et10 & ar_cry1)
ar_cry1_flag <= 1;
if(mr_start) begin
cry0 <= 0;
cry1 <= 0;
end
if(cry0) begin
cry0 <= 0;
ar_cry0 <= 1;
end
if(cry1) begin
cry1 <= 0;
ar_cry1 <= 1;
end
if(et0) begin
ar_cry0 <= 0;
ar_cry1 <= 0;
end
end
/*
* MQ
*/
// reg [0:35] mq;
reg mq36;
wire mqlt_clr = mr_clr;
wire mqlt_fm_mb0 = mq_fm_mbJ | cfac_mb_mq_swap;
wire mqlt_fm_mb1 = mq_fm_mbJ | cfac_mb_mq_swap | dct0b;
wire mqrt_clr = mr_clr;
wire mqrt_fm_mb0 = mq_fm_mbJ | cfac_mb_mq_swap;
wire mqrt_fm_mb1 = mq_fm_mbJ | cfac_mb_mq_swap | dct0b;
wire mq_shl = cfac_mq_sh_lt;
wire mq_shr = cfac_mq_sh_rt;
wire mq0_set = dst10a & ar[35];
wire mq0_clr = dst10a & ~ar[35];
wire mq0_shl_inp = shc_ashc ? ar[0] : mq[1];
wire mq0_shr_inp = ms_mult & sc_eq_777 | shc_ashc ?
ar[0] : ar[35];
wire mq1_shr_inp = shc_ashc ? ar[35] : mq[0];
wire mq35_shl_inp = ir_rotc ? ar[0] :
shc_div ? ~ar[0] :
ch_inc_op | ch_NOT_inc_op ? 1'b1 :
ir_lshc | shc_ashc | ch_dep ? 1'b0 :
1'b0; // shouldn't happen
wire mq_fm_mbJ = ft4 | ft4a | dst1 | mst1;
wire mq35_xor_mb0 = mq[35] ^ mb[0];
wire mq35_eq_mq36 = mq[35] == mq36;
always @(posedge clk) begin: mqctl
integer i;
if(mqlt_clr)
mq[0:17] <= 0;
if(mqrt_clr)
mq[18:35] <= 0;
for(i = 0; i < 18; i = i+1) begin
if(mqlt_fm_mb0 & ~mb[i])
mq[i] <= 0;
if(mqlt_fm_mb1 & mb[i])
mq[i] <= 1;
if(mqrt_fm_mb0 & ~mb[i+18])
mq[i+18] <= 0;
if(mqrt_fm_mb1 & mb[i+18])
mq[i+18] <= 1;
end
if(mq_shl)
mq <= { mq0_shl_inp, mq[2:35], mq35_shl_inp };
if(mq_shr)
mq <= { mq0_shr_inp, mq1_shr_inp, mq[1:34] };
if(mq0_set)
mq[0] <= 1;
if(mq0_clr)
mq[0] <= 0;
if(mr_clr | cfac_mq_sh_rt & ~mq[35])
mq36 <= 0;
if(cfac_mq_sh_rt & mq[35])
mq36 <= 1;
end
/*
* FE, SC
*/
reg [0:8] fe;
wire fe_clr = mr_clr;
wire fe_fm_sc1 = fpt3;
wire fe_fm_mb0_5_1 = cht8b;
reg [0:8] sc;
wire sc_clr = mr_clr | cht4 | cht8a |
fat5a | fpt3 | mst5 | dst20 |
cht6 & ch_inc_op;
wire sc_inc = fpt2 | fat2 | sht0 | fst1 | nrt0 |
sct1 | mst2 | dst14a | nrt2;
wire sc_com = cht8b | cht5 | fat3 | nrt1 | lct0 | dct0 |
et1 & ir_fsc & ~ar[0] |
fpt1 & fp_ar0_xor_fmf1 |
fat0 & ~ar0_xor_mb0 |
fpt1a & ~fp_ar0_xor_mb0_xor_fmf1 |
sht1 & mb[18] |
fpt1b & fp_mb0_eq_fmf1 |
fat7 & mb[0] |
nrt3 & (~ar[0] | nr_round);
wire sc_pad = cht2 | cht7 | sat1 | fat8 | fat1;
wire sc_cry = sat21;
wire sc_fm_fe1 = cht9 | fmt0b | fdt0b;
wire sc_fm_mb18_28_35_0 = et0a & (fsc | shift_op);
wire sc_mb0_5_0_enable = chf1;
wire sc_mb6_11_1_enable = chf2;
wire sc_ar0_8_1_enable = fsf1 | fpf1 | faf2;
wire sc_mb0_8_1_enable = fpf2 | faf1;
// TODO: what the hell is sc8b?
wire sc_eq_777 = sc == 9'o777;
wire sc0_2_eq_7 = sc[0:2] == 3'o7;
wire [0:8] sc_data =
{9{sc_mb0_5_0_enable}} & ~{ 3'b0, mb[0:5] } |
{9{sc_mb6_11_1_enable}} & { 2'b0, mb[6:11] } |
{9{sc_ar0_8_1_enable}} & ar[0:8] |
{9{sc_mb0_8_1_enable}} & mb[0:8];
wire [0:8] scN_cry = ~sc & sc_data;
wire sat0;
wire sat1;
wire sat2;
wire sat21;
wire sat3;
pa sa_pa0(.clk(clk), .reset(reset),
.in(cht3 | fst0 | fat1 | fpt1 | fpt1aa),
.p(sat0));
pa sa_pa1(.clk(clk), .reset(reset),
.in(sat0_D),
.p(sat1));
pa sa_pa2(.clk(clk), .reset(reset),
.in(sat1_D),
.p(sat2));
pa sa_pa3(.clk(clk), .reset(reset),
.in(sat2_D),
.p(sat21));
pa sa_pa4(.clk(clk), .reset(reset),
.in(sat21_D),
.p(sat3));
wire sat0_D, sat1_D, sat2_D, sat21_D;
dly150ns sa_dly0(.clk(clk), .reset(reset),
.in(sat0),
.p(sat0_D));
dly200ns sa_dly1(.clk(clk), .reset(reset),
.in(sat1),
.p(sat1_D));
dly50ns sa_dly2(.clk(clk), .reset(reset),
.in(sat2),
.p(sat2_D));
dly100ns sa_dly3(.clk(clk), .reset(reset),
.in(sat21),
.p(sat21_D));
wire sct0;
wire sct1;
wire sct2;
pa sc_pa0(.clk(clk), .reset(reset),
.in(lct0 | dct0 | sht1 | fat5 |
cht8b & ~ir_cao),
.p(sct0));
pa sc_pa1(.clk(clk), .reset(reset),
.in((sct0_D | sct1_D) & ~sc_eq_777),
.p(sct1));
pa sc_pa2(.clk(clk), .reset(reset),
.in((sct0_D | sct1_D) & sc_eq_777),
.p(sct2));
wire sct0_D, sct1_D;
dly200ns sc_dly0(.clk(clk), .reset(reset),
.in(sct0),
.p(sct0_D));
// should be 75ns
dly70ns sc_dly1(.clk(clk), .reset(reset),
.in(sct1),
.p(sct1_D));
always @(posedge clk) begin
if(fe_clr)
fe <= 0;
if(fe_fm_sc1)
fe <= fe | sc;
if(fe_fm_mb0_5_1)
fe <= fe | { 3'b0, mb[0:5]};
if(sc_clr)
sc <= 0;
if(sc_inc)
sc <= sc + 9'b1;
if(sc_com)
sc <= ~sc;
if(sc_pad)
sc <= sc ^ sc_data;
if(sc_cry)
sc <= sc + { scN_cry[1:8], 1'b0 };
if(sc_fm_fe1)
sc <= sc | fe;
if(sc_fm_mb18_28_35_0)
sc <= sc | ~{ mb[18], mb[28:35] };
if(cht4a | fmt0a | fdt0a | mpt0 | ds_div_t0)
sc[0] <= 1;
if(fpt01 | fmt0a | fdt0a | mpt0 | ds_div_t0)
sc[1] <= 1;
if(fmt0a | fdt0a | mpt0 | ds_div_t0)
sc[2] <= 1;
if(fmt0a | fdt0a)
sc[3] <= 1;
if(cht4a | mpt0 | ds_div_t0)
sc[4:5] <= 2'b11;
if(fmt0a | mpt0)
sc[6] <= 1;
if(cht4a | ds_div_t0)
sc[7] <= 1;
if(cht4a | fdt0a | ds_div_t0)
sc[8] <= 1;
end
/*
* CFAC
*/
wire cfac_ar_negate = dst0 | dst5 | dst9 | dst19 | dst21;
wire cfac_ar_add = dst11 | dst15 | dst17 | mst3 | fat9;
wire cfac_ar_sub = dst12 | dst14 | dst18 | mst4;
wire cfac_mb_fm_mqJ = mpt1 | lct0 | dct0a | dct1;
wire cfac_mb_mq_swap = dst2 | dst3 | dst7 |
dst9 | dst19a | dst21a |
blt_t0 | blt_t3a | blt_t5;
wire cfac_mb_ar_swap = dst4 | dst6 | dst8 | dst20 |
ch_inc_op & cht7 |
fat1a & ar0_eq_sc0;
wire cfac_ar_com = dst7 | dct0a | dct2 |
mpt0a & ~ir[6] & ar[0];
wire cfac_overflow = mpt0a & mpf2 & ar[0] |
mpt1 & ~ar_eq_0 |
nrt3 & ~sc[0] |
dst0a & ~ar0_eq_sc0 |
dst13;
wire cfac_ar_sh_lt = dst14a | nrt2 |
sct1 & (dcf1 | shift_op & ~mb[18]);
wire cfac_mq_sh_lt = dst14a | nrt2 | dst10b |
sct1 & (dcf1 | chf4 | shift_op & ~mb[18]);
wire cfac_ar_sh_rt = nrt0 | mst2 | dst16 | dst10a | fdt1 |
sct1 & (faf3 | lcf1 | shift_op & mb[18]);
wire cfac_mq_sh_rt = nrt0 | mst2 | mst5 | fdt1 |
sct1 & (faf3 | shift_op & mb[18]);
/*
* BLT
*/
reg blt_f0a;
reg blt_f3a;
reg blt_f5a;
wire blt_done = ~mq[0] | pi_rq;
wire blt_last = ir_blt & ~mq[0];
wire blt_t0;
wire blt_t0a;
wire blt_t1;
wire blt_t2;
wire blt_t3;
wire blt_t3a;
wire blt_t4;
wire blt_t5;
wire blt_t5a;
wire blt_t6;
pa blt_pa0(.clk(clk), .reset(reset),
.in(et3 & ir_blt),
.p(blt_t0));
pa blt_pa1(.clk(clk), .reset(reset),
.in(mc_rs_t1 & blt_f0a),
.p(blt_t0a));
pa blt_pa2(.clk(clk), .reset(reset),
.in(blt_t0a_D),
.p(blt_t1));
pa blt_pa3(.clk(clk), .reset(reset),
.in(blt_t1_D),
.p(blt_t2));
pa blt_pa4(.clk(clk), .reset(reset),
.in(blt_t2_D),
.p(blt_t3));
pa blt_pa5(.clk(clk), .reset(reset),
.in(ar_t3 & blt_f3a),
.p(blt_t3a));
pa blt_pa6(.clk(clk), .reset(reset),
.in(blt_t3a_D),
.p(blt_t4));
pa blt_pa7(.clk(clk), .reset(reset),
.in(blt_t4_D),
.p(blt_t5));
pa blt_pa8(.clk(clk), .reset(reset),
.in(ar_t3 & blt_f5a),
.p(blt_t5a));
pa blt_pa9(.clk(clk), .reset(reset),
.in(blt_t5a & ~blt_done),
.p(blt_t6));
wire blt_t0a_D, blt_t1_D;
wire blt_t2_D, blt_t3a_D;
wire blt_t4_D, blt_t6_D;
dly100ns blt_dly0(.clk(clk), .reset(reset),
.in(blt_t0a),
.p(blt_t0a_D));
dly100ns blt_dly1(.clk(clk), .reset(reset),
.in(blt_t1),
.p(blt_t1_D));
dly100ns blt_dly2(.clk(clk), .reset(reset),
.in(blt_t2),
.p(blt_t2_D));
dly100ns blt_dly3(.clk(clk), .reset(reset),
.in(blt_t3a),
.p(blt_t3a_D));
dly100ns blt_dly4(.clk(clk), .reset(reset),
.in(blt_t4),
.p(blt_t4_D));
dly100ns blt_dly5(.clk(clk), .reset(reset),
.in(blt_t6),
.p(blt_t6_D));
always @(posedge clk) begin
if(mr_clr | blt_t0a)
blt_f0a <= 0;
if(blt_t0)
blt_f0a <= 1;
if(mr_clr | blt_t3a)
blt_f3a <= 0;
if(blt_t3)
blt_f3a <= 1;
if(mr_clr | blt_t5a)
blt_f5a <= 0;
if(blt_t5)
blt_f5a <= 1;
end
/*
* FS
*/
reg fsf1;
wire fsc = ir_fsc;
wire fst0;
wire fst0a;
wire fst1;
pa fs_pa0(.clk(clk), .reset(reset),
.in(et3 & fsc),
.p(fst0));
pa fs_pa1(.clk(clk), .reset(reset),
.in(et3 & fsc & ar[0]),
.p(fst1));
pa fs_pa2(.clk(clk), .reset(reset),
.in(sat3 & fsf1),
.p(fst0a));
always @(posedge clk) begin
if(ds_clr | fst0a)
fsf1 <= 0;
if(fst0)
fsf1 <= 1;
end
/*
* CH
*/
reg chf1;
reg chf2;
reg chf3;
reg chf4;
reg chf5;
reg chf6;
reg chf7;
wire ch_inc = (ir_ldci | ir_dpci | ir_cao) & ~chf5;
wire ch_inc_op = ch_inc & ~chf7;
wire ch_NOT_inc_op = (ir_ldc | ir_dpc) & ~chf5 |
ch_inc & chf7;
wire cht1;
wire cht2;
wire cht3;
wire cht3a;
wire cht4;
wire cht4a;
wire cht5;
wire cht6;
wire cht7;
wire cht8;
wire cht8a;
wire cht8b;
wire cht9;
pa ch_pa0(.clk(clk), .reset(reset),
.in(et0 & ch_inc_op),
.p(cht1));
pa ch_pa1(.clk(clk), .reset(reset),
.in(cht1_D),
.p(cht2));
pa ch_pa2(.clk(clk), .reset(reset),
.in(cht2 | cht4a),
.p(cht3));
pa ch_pa3(.clk(clk), .reset(reset),
.in(sat3 & chf2),
.p(cht3a));
pa ch_pa4(.clk(clk), .reset(reset),
.in(cht3a & ~sc[0]),
.p(cht4));
pa ch_pa5(.clk(clk), .reset(reset),
.in(ar_t3 & chf3),
.p(cht4a));
pa ch_pa6(.clk(clk), .reset(reset),
.in(cht3a & sc[0]),
.p(cht5));
pa ch_pa7(.clk(clk), .reset(reset),
.in(et0 & ch_NOT_inc_op | cht5_D),
.p(cht6));
pa ch_pa8(.clk(clk), .reset(reset),
.in(cht6_D),
.p(cht7));
pa ch_pa9(.clk(clk), .reset(reset),
.in(cht7_D & ch_inc_op),
.p(cht8));
pa ch_pa10(.clk(clk), .reset(reset),
.in(cht7_D & ch_NOT_inc_op |
mc_rs_t1 & chf6),
.p(cht8b));
pa ch_pa11(.clk(clk), .reset(reset),
.in(sct2 & chf4),
.p(cht8a));
pa ch_pa12(.clk(clk), .reset(reset),
.in(cht8a),
.p(cht9));
wire cht1_D, cht5_D, cht6_D, cht7_D, cht8a_D;
dly100ns ch_dly0(.clk(clk), .reset(reset),
.in(cht1),
.p(cht1_D));
dly100ns ch_dly1(.clk(clk), .reset(reset),
.in(cht5),
.p(cht5_D));
dly150ns ch_dly2(.clk(clk), .reset(reset),
.in(cht6),
.p(cht6_D));
dly100ns ch_dly3(.clk(clk), .reset(reset),
.in(cht7),
.p(cht7_D));
dly100ns ch_dly4(.clk(clk), .reset(reset),
.in(cht8a),
.p(cht8a_D));
always @(posedge clk) begin
if(mp_clr | sat0)
chf1 <= 0;
if(cht1)
chf1 <= 1;
if(mp_clr | cht3a | cht8b)
chf2 <= 0;
if(cht3 | cht6)
chf2 <= 1;
if(mp_clr | cht4a)
chf3 <= 0;
if(cht4)
chf3 <= 1;
if(mp_clr | cht8a)
chf4 <= 0;
if(cht8b & ~ir_cao)
chf4 <= 1;
if(mp_clr)
chf5 <= 0;
if(cht9)
chf5 <= 1;
if(mp_clr | cht8b)
chf6 <= 0;
if(cht8)
chf6 <= 1;
if(ar_flag_clr | dct3 | lct0a |
et9 & jp_jsr)
chf7 <= 0;
if(cht9 |
ar_flag_set & mb[4])
chf7 <= 1;
end
/*
* LC
*/
reg lcf1;
wire ch_load = (ir_ldc | ir_ldci) & chf5;
wire lct0;
wire lct0a;
pa lc_pa0(.clk(clk), .reset(reset),
.in(et0 & ch_load),
.p(lct0));
pa lc_pa1(.clk(clk), .reset(reset),
.in(sct2 & lcf1),
.p(lct0a));
always @(posedge clk) begin
if(mp_clr | lct0a)
lcf1 <= 0;
if(lct0)
lcf1 <= 1;
end
/*
* DC
*/
reg dcf1;
wire ch_dep = (ir_dpc | ir_dpci) & chf5;
wire dct0;
wire dct0a;
wire dct0b = dct0a; // otherwise we get timing problems
wire dct1;
wire dct2;
wire dct3;
pa dc_pa0(.clk(clk), .reset(reset),
.in(et0 & ch_dep),
.p(dct0));
pa dc_pa1(.clk(clk), .reset(reset),
.in(sct2 & dcf1),
.p(dct0a));
pa dc_pa2(.clk(clk), .reset(reset),
.in(dct0a_D),
.p(dct1));
pa dc_pa3(.clk(clk), .reset(reset),
.in(dct1_D),
.p(dct2));
pa dc_pa4(.clk(clk), .reset(reset),
.in(dct2_D),
.p(dct3));
wire dct0a_D, dct1_D, dct2_D;
dly150ns dc_dly0(.clk(clk), .reset(reset),
.in(dct0a),
.p(dct0a_D));
dly100ns dc_dly1(.clk(clk), .reset(reset),
.in(dct1),
.p(dct1_D));
dly100ns dc_dly2(.clk(clk), .reset(reset),
.in(dct2),
.p(dct2_D));
always @(posedge clk) begin
if(mr_clr | dct0a)
dcf1 <= 0;
if(dct0)
dcf1 <= 1;
end
/*
* SH
*/
reg shf1;
wire shift_op = ir_ash | ir_ashc |
ir_lsh | ir_lshc |
ir_rot | ir_rotc;
wire sh_ac_2 = ir_ashc | ir_lshc | ir_rotc;
wire sht0;
wire sht1;
wire sht1a;
pa sh_p0(.clk(clk), .reset(reset),
.in(et1 & shift_op & mb[18]),
.p(sht0));
pa sh_p1(.clk(clk), .reset(reset),
.in(et3_D & shift_op),
.p(sht1));
pa sh_p2(.clk(clk), .reset(reset),
.in(sct2 & shf1),
.p(sht1a));
wire et3_D;
dly100ns sh_dly(.clk(clk), .reset(reset),
.in(et3),
.p(et3_D));
always @(posedge clk) begin
if(mp_clr | sht1a)
shf1 <= 0;
if(sht1)
shf1 <= 1;
end
/*
* MP
*/
reg mpf1;
reg mpf2;
wire mp_clr = mr_clr;
wire mpt0;
wire mpt0a;
wire mpt1;
wire mpt2;
pa mp_pa0(.clk(clk), .reset(reset),
.in(et0 & ir_mul),
.p(mpt0));
pa mp_pa1(.clk(clk), .reset(reset),
.in(mst6 & mpf1),
.p(mpt0a));
pa mp_pa2(.clk(clk), .reset(reset),
.in(mpt0a_D & ~ir[6]),
.p(mpt1));
pa mp_pa3(.clk(clk), .reset(reset),
.in(mpt1_D),
.p(mpt2));
wire mpt0a_D, mpt1_D, mpt2_D;
dly200ns mp_dly0(.clk(clk), .reset(reset),
.in(mpt0a),
.p(mpt0a_D));
dly100ns mp_dly1(.clk(clk), .reset(reset),
.in(mpt1),
.p(mpt1_D));
dly100ns mp_dly2(.clk(clk), .reset(reset),
.in(mpt2),
.p(mpt2_D));
always @(posedge clk) begin
if(mp_clr | mpt0a)
mpf1 <= 0;
if(mpt0)
mpf1 <= 1;
if(mp_clr)
mpf2 <= 0;
if(mpt0 & ar[0] & mb[0])
mpf2 <= 1;
end
/*
* FA
*/
reg faf1;
reg faf2;
reg faf3;
reg faf4;
wire fat0;
wire fat1;
wire fat1a;
wire fat1b;
wire fat2;
wire fat3;
wire fat4;
wire fat5;
wire fat5a;
wire fat6;
wire fat7;
wire fat8;
wire fat8a;
wire fat9;
wire fat10;
pa fa_pa0(.clk(clk), .reset(reset),
.in(et0 & ir_fad |
et4 & ir_fsb),
.p(fat0));
pa fa_pa1(.clk(clk), .reset(reset),
.in(fat0_D),
.p(fat1));
pa fa_pa2(.clk(clk), .reset(reset),
.in(sat3 & faf2),
.p(fat1a));
pa fa_pa3(.clk(clk), .reset(reset),
.in(fat1_D),
.p(fat1b));
pa fa_pa4(.clk(clk), .reset(reset),
.in(fat1a & ~sc[0]),
.p(fat2));
pa fa_pa5(.clk(clk), .reset(reset),
.in(fat2_D),
.p(fat3));
pa fa_pa6(.clk(clk), .reset(reset),
.in(fat1a & sc[0]),
.p(fat4));
pa fa_pa7(.clk(clk), .reset(reset),
.in((fat3_D | fat4_D) & sc0_2_eq_7),
.p(fat5));
pa fa_pa8(.clk(clk), .reset(reset),
.in(sct2 & faf3),
.p(fat5a));
pa fa_pa9(.clk(clk), .reset(reset),
.in((fat3_D | fat4_D) & ~sc0_2_eq_7),
.p(fat6));
pa fa_pa10(.clk(clk), .reset(reset),
.in(fat5a_D),
.p(fat7));
pa fa_pa11(.clk(clk), .reset(reset),
.in(fat7_D),
.p(fat8));
pa fa_pa12(.clk(clk), .reset(reset),
.in(fat8_D),
.p(fat8a));
pa fa_pa13(.clk(clk), .reset(reset),
.in(fat8a_D),
.p(fat9));
pa fa_pa14(.clk(clk), .reset(reset),
.in(ar_t3 & faf4),
.p(fat10));
wire fat0_D, fat1_D, fat2_D, fat3_D, fat4_D;
wire fat5a_D, fat7_D, fat8_D, fat8a_D;
dly100ns fa_dly0(.clk(clk), .reset(reset),
.in(fat0),
.p(fat0_D));
dly50ns fa_dly1(.clk(clk), .reset(reset),
.in(fat1),
.p(fat1_D));
dly150ns fa_dly2(.clk(clk), .reset(reset),
.in(fat2),
.p(fat2_D));
dly150ns fa_dly3(.clk(clk), .reset(reset),
.in(fat3),
.p(fat3_D));
dly100ns fa_dly4(.clk(clk), .reset(reset),
.in(fat4),
.p(fat4_D));
dly100ns fa_dly5(.clk(clk), .reset(reset),
.in(fat5a),
.p(fat5a_D));
dly100ns fa_dly6(.clk(clk), .reset(reset),
.in(fat7),
.p(fat7_D));
dly50ns fa_dly7(.clk(clk), .reset(reset),
.in(fat8),
.p(fat8_D));
dly100ns fa_dly8(.clk(clk), .reset(reset),
.in(fat8a),
.p(fat8a_D));
always @(posedge clk) begin
if(mp_clr | fat1b | fat10)
faf1 <= 0;
if(fat0 | fat5a)
faf1 <= 1;
if(mp_clr | fat1a)
faf2 <= 0;
if(fat1b)
faf2 <= 1;
if(mp_clr | fat5a)
faf3 <= 0;
if(fat5)
faf3 <= 1;
if(mp_clr | fat10)
faf4 <= 0;
if(fat9)
faf4 <= 1;
end
/*
* FM
*/
reg fmf1;
reg fmf2;
wire fmt0;
wire fmt0a;
wire fmt0b;
pa fm_pa0(.clk(clk), .reset(reset),
.in(et0 & ir_fmp),
.p(fmt0));
pa fm_pa1(.clk(clk), .reset(reset),
.in(fpt4 & fmf1),
.p(fmt0a));
pa fm_pa2(.clk(clk), .reset(reset),
.in(mst6 & fmf2),
.p(fmt0b));
wire fmt0b_D;
dly100ns fm_dly0(.clk(clk), .reset(reset),
.in(fmt0b),
.p(fmt0b_D));
always @(posedge clk) begin
if(mp_clr | fmt0a)
fmf1 <= 0;
if(fmt0)
fmf1 <= 1;
if(mp_clr | fmt0b)
fmf2 <= 0;
if(fmt0a)
fmf2 <= 1;
end
/*
* FD
*/
reg fdf1;
reg fdf2;
wire fdt0;
wire fdt0a;
wire fdt0b;
wire fdt1;
pa fd_pa0(.clk(clk), .reset(reset),
.in(et0 & ir_fdv),
.p(fdt0));
pa fd_pa1(.clk(clk), .reset(reset),
.in(fpt4 & fdf1),
.p(fdt0a));
pa fd_pa2(.clk(clk), .reset(reset),
.in(dst21a & fdf2),
.p(fdt0b));
pa fd_pa3(.clk(clk), .reset(reset),
.in(fdt0b_D),
.p(fdt1));
wire fdt0b_D;
dly100ns fd_dly0(.clk(clk), .reset(reset),
.in(fdt0b),
.p(fdt0b_D));
always @(posedge clk) begin
if(mp_clr | fdt0a)
fdf1 <= 0;
if(fdt0)
fdf1 <= 1;
if(mp_clr | fdt0b)
fdf2 <= 0;
if(fdt0a)
fdf2 <= 1;
end
/*
* FP
*/
reg fpf1;
reg fpf2;
wire fp_ar0_xor_fmf1 = ar[0] ^ fmf1;
wire fp_ar0_xor_mb0_xor_fmf1 = fp_ar0_xor_fmf1 ^ mb[0];
wire fp_mb0_eq_fmf1 = mb[0] == fmf1;
wire fpt0;
wire fpt01;
wire fpt1;
wire fpt1a;
wire fpt1aa;
wire fpt1b;
wire fpt2;
wire fpt3;
wire fpt4;
pa fp_pa0(.clk(clk), .reset(reset),
.in(fmt0 | fdt0),
.p(fpt0));
pa fp_pa1(.clk(clk), .reset(reset),
.in(fpt0),
.p(fpt01));
pa fp_pa2(.clk(clk), .reset(reset),
.in(fpt01_D),
.p(fpt1));
pa fp_pa3(.clk(clk), .reset(reset),
.in(sat3 & fpf1),
.p(fpt1a));
pa fp_pa4(.clk(clk), .reset(reset),
.in(fpt1a_D),
.p(fpt1aa));
pa fp_pa5(.clk(clk), .reset(reset),
.in(sat3 & fpf2),
.p(fpt1b));
pa fp_pa6(.clk(clk), .reset(reset),
.in(fpt1a & fp_ar0_xor_mb0_xor_fmf1),
.p(fpt2));
pa fp_pa7(.clk(clk), .reset(reset),
.in(fpt1b_D),
.p(fpt3));
pa fp_pa8(.clk(clk), .reset(reset),
.in(fpt3_D),
.p(fpt4));
wire fpt01_D, fpt1a_D, fpt1b_D, fpt3_D;
dly100ns fp_dly0(.clk(clk), .reset(reset),
.in(fpt01),
.p(fpt01_D));
dly100ns fp_dly1(.clk(clk), .reset(reset),
.in(fpt1a),
.p(fpt1a_D));
dly100ns fp_dly2(.clk(clk), .reset(reset),
.in(fpt1b),
.p(fpt1b_D));
dly100ns fp_dly3(.clk(clk), .reset(reset),
.in(fpt3),
.p(fpt3_D));
always @(posedge clk) begin
if(mp_clr | fpt1a)
fpf1 <= 0;
if(fpt1)
fpf1 <= 1;
if(mp_clr | fpt1b)
fpf2 <= 0;
if(fpt1aa)
fpf2 <= 1;
end
/*
* MS
*/
reg msf1;
wire ms_mult = mpf1 | fmf2;
wire mst1;
wire mst2;
wire mst3;
wire mst3a;
wire mst4;
wire mst5;
wire mst6;
pa ms_pa0(.clk(clk), .reset(reset),
.in(mpt0 | fmt0a),
.p(mst1));
pa ms_pa1(.clk(clk), .reset(reset),
.in(((mst1_D1 | mst2_D) & mq35_eq_mq36 | mst3a) & ~sc_eq_777),
.p(mst2));
pa ms_pa2(.clk(clk), .reset(reset),
.in((mst1_D1 | mst2_D) & ~mq[35] & mq36),
.p(mst3));
pa ms_pa3(.clk(clk), .reset(reset),
.in((mst1_D1 | mst2_D) & mq[35] & ~mq36),
.p(mst4));
pa ms_pa4(.clk(clk), .reset(reset),
.in(ar_t3 & msf1),
.p(mst3a));
pa ms_pa5(.clk(clk), .reset(reset),
.in((mst2_D & mq35_eq_mq36 | mst3a) & sc_eq_777),
.p(mst5));
pa ms_pa6(.clk(clk), .reset(reset),
.in(mst5_D),
.p(mst6));
wire mst1_D0, mst1_D1;
wire mst2_D, mst5_D;
dly50ns ms_dly0(.clk(clk), .reset(reset),
.in(mst1),
.p(mst1_D0));
dly200ns ms_dly1(.clk(clk), .reset(reset),
.in(mst1),
.p(mst1_D1));
dly150ns ms_dly2(.clk(clk), .reset(reset),
.in(mst2),
.p(mst2_D));
dly100ns ms_dly3(.clk(clk), .reset(reset),
.in(mst5),
.p(mst5_D));
always @(posedge clk) begin
if(mp_clr | mst3a)
msf1 <= 0;
if(mst3 | mst4)
msf1 <= 1;
end
/*
* DS
*/
reg dsf1;
reg dsf2;
reg dsf3;
reg dsf4;
reg dsf5;
reg dsf6;
reg dsf7;
reg dsf8;
reg dsf9;
wire ds_div = ir_div & ir[6];
wire ds_divi = ir_div & ~ir[6];
wire dsf7_xor_mq0 = dsf7 ^ mq[0];
wire ds_clr;
wire dst0;
wire dst0a;
wire dst1;
wire dst2;
wire dst3;
wire dst4;
wire dst5;
wire dst5a;
wire dst6;
wire dst7;
wire dst8;
wire dst9;
wire dst10;
wire dst10a;
wire dst10b;
wire dst11;
wire dst11a;
wire dst12;
wire dst13;
wire dst14a;
wire dst14b;
wire dst14;
wire dst15;
wire dst16;
wire dst17;
wire dst17a;
wire dst18;
wire dst19;
wire dst19a;
wire dst19b;
wire dst20;
wire dst21;
wire dst21a;
wire ds_div_t0;
pa ds_pa0(.clk(clk), .reset(reset),
.in(mr_clr),
.p(ds_clr));
pa ds_pa1(.clk(clk), .reset(reset),
.in(et0 & ir_div),
.p(ds_div_t0));
pa ds_pa2(.clk(clk), .reset(reset),
.in((et0 & ds_divi | fdt0a) & ar[0]),
.p(dst0));
pa ds_pa3(.clk(clk), .reset(reset),
.in(ar_t3 & dsf1),
.p(dst0a));
pa ds_pa4(.clk(clk), .reset(reset),
.in((et0 & ~ar[0] | dst0a) & ds_divi),
.p(dst1));
pa ds_pa5(.clk(clk), .reset(reset),
.in(dst1_D),
.p(dst2));
pa ds_pa6(.clk(clk), .reset(reset),
.in(et0 & ar[0] & ds_div),
.p(dst3));
pa ds_pa7(.clk(clk), .reset(reset),
.in(dst3_D),
.p(dst4));
pa ds_pa8(.clk(clk), .reset(reset),
.in(dst4_D),
.p(dst5));
pa ds_pa9(.clk(clk), .reset(reset),
.in(ar_t3 & dsf2),
.p(dst5a));
pa ds_pa10(.clk(clk), .reset(reset),
.in(dst5a_D & ~ar_eq_0),
.p(dst6));
pa ds_pa11(.clk(clk), .reset(reset),
.in(dst6_D),
.p(dst7));
pa ds_pa12(.clk(clk), .reset(reset),
.in(dst5a_D & ar_eq_0),
.p(dst8));
pa ds_pa13(.clk(clk), .reset(reset),
.in(dst8_D),
.p(dst9));
pa ds_pa14(.clk(clk), .reset(reset),
.in(ar_t3 & dsf3 |
fdt0a & ~ar[0] |
dst0a & ~ds_divi |
et0 & ds_div & ~ar[0] |
dst2 | dst7),
.p(dst10));
pa ds_pa15(.clk(clk), .reset(reset),
.in(dst10_D & ir_fdv),
.p(dst10a));
pa ds_pa16(.clk(clk), .reset(reset),
.in(dst10_D & ir_div),
.p(dst10b));
pa ds_pa17(.clk(clk), .reset(reset),
.in((dst10a_D | dst10b_D) & mb[0]),
.p(dst11));
pa ds_pa18(.clk(clk), .reset(reset),
.in((dst10a_D | dst10b_D) & ~mb[0]),
.p(dst12));
pa ds_pa19(.clk(clk), .reset(reset),
.in(ar_t3 & dsf4),
.p(dst11a));
pa ds_pa20(.clk(clk), .reset(reset),
.in(dst11a & ~ar[0]),
.p(dst13));
pa ds_pa21(.clk(clk), .reset(reset),
.in(ar_t3 & dsf5 |
dst11a & ar[0]),
.p(dst14a));
pa ds_pa22(.clk(clk), .reset(reset),
.in(dst14a),
.p(dst14b));
pa ds_pa23(.clk(clk), .reset(reset),
.in(dst14b_D & ~sc_eq_777 & mq35_xor_mb0),
.p(dst14));
pa ds_pa24(.clk(clk), .reset(reset),
.in(dst14b_D & ~sc_eq_777 & ~mq35_xor_mb0),
.p(dst15));
pa ds_pa25(.clk(clk), .reset(reset),
.in(dst14b_D & sc_eq_777),
.p(dst16));
pa ds_pa26(.clk(clk), .reset(reset),
.in(dst16_D & ar[0] & ~mb[0]),
.p(dst17));
pa ds_pa27(.clk(clk), .reset(reset),
.in(dst16_D & ar[0] & mb[0]),
.p(dst18));
pa ds_pa28(.clk(clk), .reset(reset),
.in(dst16_D & ~ar[0] |
ar_t3 & dsf6),
.p(dst17a));
pa ds_pa29(.clk(clk), .reset(reset),
.in(dst17a & dsf7),
.p(dst19));
pa ds_pa30(.clk(clk), .reset(reset),
.in(dst17a & ~dsf7 |
ar_t3 & dsf8),
.p(dst19a));
pa ds_pa31(.clk(clk), .reset(reset),
.in(dst19_D),
.p(dst19b));
pa ds_pa32(.clk(clk), .reset(reset),
.in(dst19a_D),
.p(dst20));
pa ds_pa33(.clk(clk), .reset(reset),
.in(dst20_D & dsf7_xor_mq0),
.p(dst21));
pa ds_pa34(.clk(clk), .reset(reset),
.in(dst20_D & ~dsf7_xor_mq0 |
ar_t3 & dsf9),
.p(dst21a));
wire dst1_D, dst3_D, dst4_D, dst5a_D, dst6_D, dst8_D;
wire dst10_D, dst10a_D, dst10b_D, dst14b_D, dst16_D;
wire dst19_D, dst19a_D, dst20_D;
dly150ns ds_dly0(.clk(clk), .reset(reset),
.in(dst1),
.p(dst1_D));
dly100ns ds_dly1(.clk(clk), .reset(reset),
.in(dst3),
.p(dst3_D));
dly100ns ds_dly2(.clk(clk), .reset(reset),
.in(dst4),
.p(dst4_D));
dly100ns ds_dly3(.clk(clk), .reset(reset),
.in(dst5a),
.p(dst5a_D));
dly100ns ds_dly4(.clk(clk), .reset(reset),
.in(dst6),
.p(dst6_D));
dly100ns ds_dly5(.clk(clk), .reset(reset),
.in(dst8),
.p(dst8_D));
dly100ns ds_dly6(.clk(clk), .reset(reset),
.in(dst10),
.p(dst10_D));
dly200ns ds_dly7(.clk(clk), .reset(reset),
.in(dst10a),
.p(dst10a_D));
dly200ns ds_dly8(.clk(clk), .reset(reset),
.in(dst10b),
.p(dst10b_D));
dly100ns ds_dly9(.clk(clk), .reset(reset),
.in(dst14b),
.p(dst14b_D));
dly100ns ds_dly10(.clk(clk), .reset(reset),
.in(dst16),
.p(dst16_D));
dly50ns ds_dly11(.clk(clk), .reset(reset),
.in(dst19),
.p(dst19_D));
dly100ns ds_dly12(.clk(clk), .reset(reset),
.in(dst19a),
.p(dst19a_D));
dly100ns ds_dly13(.clk(clk), .reset(reset),
.in(dst20),
.p(dst20_D));
always @(posedge clk) begin
if(ds_clr | dst0a)
dsf1 <= 0;
if(dst0)
dsf1 <= 1;
if(ds_clr | dst5a)
dsf2 <= 0;
if(dst5)
dsf2 <= 1;
if(ds_clr | dst10)
dsf3 <= 0;
if(dst9)
dsf3 <= 1;
if(ds_clr | dst11a)
dsf4 <= 0;
if(dst11 | dst12)
dsf4 <= 1;
if(ds_clr | dst14a)
dsf5 <= 0;
if(dst14 | dst15)
dsf5 <= 1;
if(ds_clr | dst17a)
dsf6 <= 0;
if(dst17 | dst18)
dsf6 <= 1;
if(mr_clr)
dsf7 <= 0;
if(dst0 | dst3)
dsf7 <= 1;
if(ds_clr | dst19a)
dsf8 <= 0;
if(dst19b)
dsf8 <= 1;
if(ds_clr | dst21a)
dsf9 <= 0;
if(dst21)
dsf9 <= 1;
end
/*
* NR
*/
reg nrf1;
reg nrf2;
reg nrf3;
wire nr_ar9_eq_ar0 = ar[9] == ar[0];
wire nr_round = ~nrf3 & mq[1] & ir[6];
wire nr_ar_eq_0_AND_mq1_0 = ar == 0 & ~mq[1];
wire nrt05;
wire nrt0;
wire nrt01;
wire nrt1;
wire nrt2;
wire nrt3;
wire nrt31;
wire nrt4;
wire nrt5;
wire nrt5a;
wire nrt6;
pa nr_pa0(.clk(clk), .reset(reset),
.in(fdt1 | fat10 | nrt5a),
.p(nrt05));
pa nr_pa1(.clk(clk), .reset(reset),
.in(nrt05_D),
.p(nrt0));
pa nr_pa2(.clk(clk), .reset(reset),
.in(nrt0),
.p(nrt01));
pa nr_pa3(.clk(clk), .reset(reset),
.in((fmt0b_D | nrt01_D) & ~nr_ar_eq_0_AND_mq1_0),
.p(nrt1));
pa nr_pa4(.clk(clk), .reset(reset),
.in((nrt1_D | nrt2_D) & nr_ar9_eq_ar0 & ~ar_eq_fp_half),
.p(nrt2));
pa nr_pa5(.clk(clk), .reset(reset),
.in((nrt1_D | nrt2_D) & (~nr_ar9_eq_ar0 | ar_eq_fp_half)),
.p(nrt3));
pa nr_pa6(.clk(clk), .reset(reset),
.in(nrt3),
.p(nrt31));
pa nr_pa7(.clk(clk), .reset(reset),
.in(nrt31_D & ~nr_round),
.p(nrt4));
pa nr_pa8(.clk(clk), .reset(reset),
.in(nrt31_D & nr_round),
.p(nrt5));
pa nr_pa9(.clk(clk), .reset(reset),
.in(ar_t3 & nrf1),
.p(nrt5a));
pa nr_pa10(.clk(clk), .reset(reset),
.in((fmt0b_D | nrt01_D) & nr_ar_eq_0_AND_mq1_0 |
nrt4 |
mpt0a & ir[6] |
mpt2_D),
.p(nrt6));
wire nrt05_D, nrt01_D, nrt1_D, nrt2_D, nrt31_D;
dly100ns nr_dly0(.clk(clk), .reset(reset),
.in(nrt05),
.p(nrt05_D));
dly200ns nr_dly1(.clk(clk), .reset(reset),
.in(nrt01),
.p(nrt01_D));
dly100ns nr_dly2(.clk(clk), .reset(reset),
.in(nrt1),
.p(nrt1_D));
dly150ns nr_dly3(.clk(clk), .reset(reset),
.in(nrt2),
.p(nrt2_D));
dly100ns nr_dly4(.clk(clk), .reset(reset),
.in(nrt31),
.p(nrt31_D));
always @(posedge clk) begin
if(mp_clr | nrt5a)
nrf1 <= 0;
if(nrt5)
nrf1 <= 1;
if(mp_clr) begin
nrf2 <= 0;
nrf3 <= 0;
end
if(nrt05 | fdt0b | fmt0b)
nrf2 <= 1;
if(nrt5a)
nrf3 <= 1;
end
/*
* MA
*/
// reg [18:35] ma;
reg ma32_cry_out;
wire ma_clr = it0 | at0 | at3 | ft4a | key_ma_clr | iot_t0a |
et1 & ma_clr_et1 |
et9 & ma_reset_et9 |
st3 & ~s_ac_inh |
ft1a & ~f_ac_2;
wire ma_inc = st6 | key_ma_inc | uuo_t1 |
ft1a & f_ac_2 |
it1 & pi_ov;
wire ma_fm_mbrt1 = at5 | ft3 | ft5 |
et3 & ma_fm_mbrt_et3 |
et10 & ma_reset_et9;
wire ma_fm_pc1 = it1 & ~pi_cyc;
wire ma31_cry_in_en = ~s_ac_2 & ~f_ac_2;
wire [30:35] maN_set;
wire ma_eq_mas = ma == mas;
wire ma18_31_eq_0 = ma[18:31] == 0;
wire ma_fmc_select = ~key_rim_sbr & ma18_31_eq_0;
wire ma_fm_mbrt_et3 = jp_popj | ir_blt;
wire ma_clr_et1 = jp_popj | ex_ir_uuo | ir_blt;
wire ma_reset_et9 = jp_push | jp_pushj | ir_jrst;
wire ma_fm_ir14_17 = at2;
wire ma_fm_ir9_12 = ft1 | st5;
wire ma_fm_pich = it1 & pi_cyc;
assign maN_set[30] = ma_fm_pich |
et3 & ex_ir_uuo;
assign maN_set[31] = 0;
assign maN_set[32] = pi_enc_32 |
ma_fm_ir14_17 & ir[14] |
ma_fm_ir9_12 & ir[9];
assign maN_set[33] = pi_enc_33 |
ma_fm_ir14_17 & ir[15] |
ma_fm_ir9_12 & ir[10];
assign maN_set[34] = pi_enc_34 |
ma_fm_ir14_17 & ir[16] |
ma_fm_ir9_12 & ir[11];
assign maN_set[35] =
ma_fm_ir14_17 & ir[17] |
ma_fm_ir9_12 & ir[12];
always @(posedge clk) begin: mactl
integer i;
if(ma_clr)
ma <= 0;
if(ma_inc)
{ma32_cry_out, ma[32:35]} <= ma[32:35] + 4'b1;
if(ma32_cry_out) begin
if(ma31_cry_in_en)
ma[18:31] <= ma[18:31] + 14'b1;
ma32_cry_out <= 1'b0;
end
if(ma_fm_mbrt1)
ma <= ma | mb[18:35];
if(ma_fm_pc1)
ma <= ma | pc;
if(key_ma_fm_masw1)
ma <= ma | mas;
for(i = 30; i <= 35; i = i + 1)
if(maN_set[i]) ma[i] <= 1;
end
/*
* PR
*/
// reg [18:25] pr;
wire pr18_ok = ma[18:25] <= pr;
wire pr_rel_AND_ma_ok = ~ex_inh_rel & pr18_ok;
wire pr_rel_AND_NOT_ma_ok = ~ex_inh_rel & ~pr18_ok;
/*
* RLR, RLA
*/
// reg [18:25] rlr;
// wire [18:25] rla = ma[18:25] + (ex_inh_rel ? 0 : rlr);
assign rla = ma[18:25] + (ex_inh_rel ? 8'b0 : rlr);
always @(posedge clk) begin
if(ex_clr) begin
pr <= 0;
rlr <= 0;
end
if(ex_set) begin
pr <= pr | iob[0:7];
rlr <= rlr | iob[18:25];
end
end
/*
* MI
*/
// reg [0:35] mi;
wire milt_clr = mi_clr;
wire milt_fm_mblt1 = mi_fm_mb1;
wire mirt_clr = mi_clr;
wire mirt_fm_mbrt1 = mi_fm_mb1;
wire mi_clr;
wire mi_fm_mb1;
pa mi_pa0(.clk(clk), .reset(reset),
.in(mc_rs_t1 & key_ex_OR_dep_nxt |
mc_wr_rs & ma_eq_mas |
mai_rd_rs & ma_eq_mas),
.p(mi_clr));
pa mi_pa1(.clk(clk), .reset(reset),
.in(mi_clr_D),
.p(mi_fm_mb1));
wire mi_clr_D;
dly100ns mi_dly0(.clk(clk), .reset(reset),
.in(mi_clr),
.p(mi_clr_D));
always @(posedge clk) begin
if(milt_clr)
mi[0:17] <= 0;
if(mirt_clr)
mi[18:35] <= 0;
if(milt_fm_mblt1)
mi[0:17] <= mi[0:17] | mb[0:17];
if(mirt_fm_mbrt1)
mi[18:35] <= mi[18:35] | mb[18:35];
end
/*
* MC
*/
reg mc_rd;
reg mc_wr;
reg mc_rq;
// reg mc_stop;
reg mc_stop_sync;
reg mc_split_cyc_sync;
// TODO: what is MC DR SPLIT?
wire mc_sw_stop = key_mem_stop | sw_addr_stop;
wire mc_rd_rq_pulse;
wire mc_wr_rq_pulse;
wire mc_rdwr_rq_pulse;
wire mc_rq_pulse;
wire mc_rdwr_rs_pulse;
wire mc_split_rd_rq;
wire mc_split_wr_rq;
wire mc_mb_clr;
wire mc_rs_t0;
wire mc_rs_t1;
wire mc_wr_rs;
wire mai_addr_ack;
wire mai_rd_rs;
wire mc_addr_ack;
wire mc_non_exist_mem;
wire mc_non_exist_mem_rst;
wire mc_non_exist_rd;
wire mc_illeg_address;
wire mc_rq_set;
wire mc_stop_set = mc_rq_pulse_D2 &
(key_mem_stop | sw_addr_stop & ma_eq_mas);
wire mc_membus_fm_mb1;
wire mc_mb_membus_enable = mc_rd;
pg mc_pg0(.clk(clk), .reset(reset),
.in(membus_addr_ack), .p(mai_addr_ack));
pg mc_pg1(.clk(clk), .reset(reset),
.in(membus_rd_rs), .p(mai_rd_rs));
pa mc_pa0(.clk(clk), .reset(reset),
.in(it1 | at2 | at5 |
ft1 | ft4 | ft6 |
key_rd | uuo_t2 | mc_split_rd_rq),
.p(mc_rd_rq_pulse));
pa mc_pa1(.clk(clk), .reset(reset),
.in(st1 | st5 | st6 | key_wr |
mblt_fm_ir1_uuo_t0 | mc_split_wr_rq | blt_t0),
.p(mc_wr_rq_pulse));
pa mc_pa2(.clk(clk), .reset(reset),
.in(ft7 & ~mc_split_cyc_sync),
.p(mc_rdwr_rq_pulse));
pa mc_pa3(.clk(clk), .reset(reset),
.in(mc_rdwr_rq_pulse | mc_rd_rq_pulse | mc_wr_rq_pulse),
.p(mc_rq_pulse));
pa mc_pa4(.clk(clk), .reset(reset),
.in(st2 | iot_t0 | cht8),
.p(mc_rdwr_rs_pulse));
pa mc_pa5(.clk(clk), .reset(reset),
.in(ft7 & mc_split_cyc_sync),
.p(mc_split_rd_rq));
pa mc_pa6(.clk(clk), .reset(reset),
.in(mc_rdwr_rs_pulse & mc_split_cyc_sync),
.p(mc_split_wr_rq));
pa mc_pa7(.clk(clk), .reset(reset),
.in(mc_rd_rq_pulse | mc_rdwr_rq_pulse),
.p(mc_mb_clr));
pa mc_pa8(.clk(clk), .reset(reset),
.in(mc_rq_pulse_D3 & mc_rq & ~mc_stop),
.p(mc_non_exist_mem));
pa mc_pa9(.clk(clk), .reset(reset),
.in(mc_non_exist_mem & ~sw_mem_disable),
.p(mc_non_exist_mem_rst));
pa mc_pa10(.clk(clk), .reset(reset),
.in(mc_non_exist_mem_rst & mc_rd),
.p(mc_non_exist_rd));
pa mc_pa11(.clk(clk), .reset(reset),
.in(mc_rq_pulse_D0 & ex_inh_rel |
mc_rq_pulse_D1 & pr_rel_AND_ma_ok),
.p(mc_rq_set));
pa mc_pa12(.clk(clk), .reset(reset),
.in(mc_rq_pulse_D1 & pr_rel_AND_NOT_ma_ok),
.p(mc_illeg_address));
pa mc_pa13(.clk(clk), .reset(reset),
.in(mai_addr_ack | mc_non_exist_mem_rst),
.p(mc_addr_ack));
pa mc_pa14(.clk(clk), .reset(reset),
.in(mc_addr_ack & ~mc_rd & mc_wr |
mc_rdwr_rs_pulse_D & ~mc_split_cyc_sync |
kt1 & key_manual & mc_stop & mc_stop_sync & ~key_mem_cont),
.p(mc_wr_rs));
pa mc_pa15(.clk(clk), .reset(reset),
.in(kt1 & key_mem_cont & mc_stop |
~mc_stop & (mc_wr_rs | mai_rd_rs | mc_non_exist_rd)),
.p(mc_rs_t0));
pa mc_pa16(.clk(clk), .reset(reset), .in(mc_rs_t0_D), .p(mc_rs_t1));
bd mc_bd0(.clk(clk), .reset(reset), .in(mc_wr_rs), .p(membus_wr_rs));
bd2 mb_bd1(.clk(clk), .reset(reset), .in(mc_wr_rs), .p(mc_membus_fm_mb1));
wire mc_rdwr_rs_pulse_D, mc_rs_t0_D;
wire mc_rq_pulse_D0, mc_rq_pulse_D1, mc_rq_pulse_D2, mc_rq_pulse_D3;
dly100ns mc_dly0(.clk(clk), .reset(reset),
.in(mc_rdwr_rs_pulse),
.p(mc_rdwr_rs_pulse_D));
dly50ns mc_dly1(.clk(clk), .reset(reset),
.in(mc_rq_pulse),
.p(mc_rq_pulse_D0));
dly150ns mc_dly2(.clk(clk), .reset(reset),
.in(mc_rq_pulse),
.p(mc_rq_pulse_D1));
dly200ns mc_dly3(.clk(clk), .reset(reset),
.in(mc_rq_pulse),
.p(mc_rq_pulse_D2));
dly100us mc_dly4(.clk(clk), .reset(reset), .in(mc_rq_pulse),
.p(mc_rq_pulse_D3));
dly50ns mc_dly5(.clk(clk), .reset(reset), .in(mc_rs_t0),
.p(mc_rs_t0_D));
assign membus_rq_cyc = mc_rq & (mc_rd | mc_wr);
assign membus_wr_rq = mc_wr;
assign membus_rd_rq = mc_rd;
assign membus_ma = { rla[21:25], ma[26:35] };
assign membus_sel = rla[18:21];
assign membus_fmc_select = ma_fmc_select;
assign membus_mb_out = mc_membus_fm_mb1 ? mb : 0;
always @(posedge clk) begin
if(mr_clr) begin
mc_rd <= 0;
mc_wr <= 0;
mc_rq <= 0;
mc_stop <= 0;
mc_stop_sync <= 0;
mc_split_cyc_sync <= 0;
end
if(mc_wr_rq_pulse | mc_rs_t1)
mc_rd <= 0;
if(mc_rd_rq_pulse | mc_rdwr_rq_pulse)
mc_rd <= 1;
if(mc_rd_rq_pulse)
mc_wr <= 0;
if(mc_wr_rq_pulse | mc_rdwr_rq_pulse)
mc_wr <= 1;
if(mc_addr_ack)
mc_rq <= 0;
if(mc_rq_set)
mc_rq <= 1;
if(mc_rq_pulse)
mc_stop <= 0;
if(mc_stop_set)
mc_stop <= 1;
if(mc_rdwr_rq_pulse)
mc_stop_sync <= 1;
if(at4 & mc_sw_stop)
mc_split_cyc_sync <= 1;
end
/*
* IOT
*/
reg iot_go;
reg iot_f0a;
wire iot_blki = ir_iot & ir[10:12] == 0;
wire iot_datai = ir_iot & ir[10:12] == 1;
wire iot_blko = ir_iot & ir[10:12] == 2;
wire iot_datao = ir_iot & ir[10:12] == 3;
wire iot_cono = ir_iot & ir[10:12] == 4;
wire iot_coni = ir_iot & ir[10:12] == 5;
wire iot_consz = ir_iot & ir[10:12] == 6;
wire iot_conso = ir_iot & ir[10:12] == 7;
wire iot_blk = iot_blki | iot_blko;
wire iot_outgoing = iot_datao | iot_cono;
wire iot_status = iot_coni | iot_consz | iot_conso;
wire iot_datai_o = iot_datai | iot_datao;
wire iot_init_setup;
wire iot_restart;
wire iot_final_setup;
wire iot_reset;
wire iot_t0;
wire iot_t0a;
wire iot_t2;
wire iot_t3;
wire iot_t3a;
wire iot_t4;
wire iot_go_P;
pg iot_pg0(.clk(clk), .reset(reset),
.in(iot_go & ~iot_reset),
.p(iot_go_P));
assign iobus_iob_poweron = sw_power;
pa iot_pa0(.clk(clk), .reset(reset),
.in(mr_start | cpa_cono_set & iob[19]),
.p(iobus_iob_reset));
pa iot_pa1(.clk(clk), .reset(reset),
.in(iot_t2 & iot_cono),
.p(iobus_cono_clear));
pa iot_pa2(.clk(clk), .reset(reset),
.in(iot_t3 & iot_cono),
.p(iobus_cono_set));
pa iot_pa3(.clk(clk), .reset(reset),
.in(iot_t2 & iot_datao),
.p(iobus_datao_clear));
pa iot_pa4(.clk(clk), .reset(reset),
.in(iot_t3 & iot_datao),
.p(iobus_datao_set));
pa iot_pa5(.clk(clk), .reset(reset),
.in(et4 & iot_blk),
.p(iot_t0));
pa iot_pa6(.clk(clk), .reset(reset),
.in(mc_rs_t1 & iot_f0a),
.p(iot_t0a));
assign iobus_iob_fm_datai = iot_datai & iot_drive;
assign iobus_iob_fm_status = iot_status & iot_drive;
wire iob_fm_ar1 = iot_outgoing & iot_drive;
wire iot_t0a_D;
dly200ns iot_dly0(.clk(clk), .reset(reset),
.in(iot_t0a),
.p(iot_t0a_D));
ldly1us iot_dly1(.clk(clk), .reset(reset),
.in(iot_go_P),
.p(iot_t2),
.l(iot_init_setup));
ldly1_5us iot_dly2(.clk(clk), .reset(reset),
.in(iot_t2),
.p(iot_t3a),
.l(iot_final_setup));
ldly2us iot_dly3(.clk(clk), .reset(reset),
.in(iot_t3a),
.p(iot_t4),
.l(iot_reset));
ldly1us iot_dly4(.clk(clk), .reset(reset),
.in(iot_t2),
.p(iot_t3),
.l(iot_restart));
wire iot_drive = iot_init_setup | iot_final_setup | iot_t2;
always @(posedge clk) begin
if(mr_clr | iot_t2)
iot_go <= 0;
if(et4 & ir_iot & ~iot_blk)
iot_go <= 1;
if(mr_clr | iot_t0a)
iot_f0a <= 0;
if(iot_t0)
iot_f0a <= 1;
end
/* IOB */
assign iobus_iob_out = iob_fm_ar1 ? ar :
cpa_status ? cpa_iob :
pi_status ? pi_iob :
0;
wire [0:35] iob = iobus_iob_in;
/*
* PIH, PIR, PIO
*/
// pih contains the currently serviced pi reqs.
// lower channels override higher ones.
// reg [1:7] pih;
wire pih_clr = pi_reset;
wire pih_fm_pi_ch_rq = et0a & pi_hold;
wire pih0_fm_pi_ok1 = et1 & pi_rst;
// pir contains all current and allowed pi reqs.
// reg [1:7] pir;
wire pir_clr = pi_reset;
wire pir_fm_iob1 = pi_cono_set & iob[24];
wire pir_stb;
// pio is a mask of which pi reqs are allowed.
// reg [1:7] pio;
wire pio_fm_iob1 = pi_cono_set & iob[25];
wire pio0_fm_iob1 = pi_cono_set & iob[26];
// pi_req has the currently highest priority request.
wire [1:7] pi_req;
// pi_ok is used to mask out low priority reqs
wire [1:8] pi_ok;
// requests coming from the bus
wire [1:7] iob_pi_req = iobus_pi_req | cpa_req;
// TODO: this can be simpler, same as in KA10 code
assign pi_ok[1] = pi_active;
genvar i;
generate
for(i = 1; i <= 7; i = i + 1) begin: pi_reg_gen
assign pi_req[i] = pi_ok[i] & ~pih[i] & pir[i];
assign pi_ok[i+1] = pi_ok[i] & ~pih[i] & ~pir[i];
end
endgenerate
always @(posedge clk) begin: pirctl
integer i;
if(pih_clr)
pih <= 0;
if(pih_fm_pi_ch_rq)
pih <= pih | pi_req;
if(pih0_fm_pi_ok1)
pih <= pih & ~pi_ok[1:7];
if(pir_clr)
pir <= 0;
else if(pir_fm_iob1)
pir <= pir | iob[29:35];
else if(pir_stb)
for(i = 1; i <= 7; i = i+1) begin
if(iob_pi_req[i] & pio[i])
pir[i] <= 1;
end
else
pir <= pir & ~pih;
if(pi_reset)
pio <= 0;
if(pio_fm_iob1)
pio <= pio | iob[29:35];
if(pio0_fm_iob1)
pio <= pio & ~iob[29:35];
end
/*
* PI
*/
reg pi_ov;
reg pi_cyc;
// reg pi_active;
wire pi_select = iobus_ios == 1;
wire pi_status = pi_select & iobus_iob_fm_status;
wire pi_cono_set = pi_select & iobus_cono_set;
wire pi_rq = | pi_req;
wire pi_enc_32 = pi_req[4] | pi_req[5] | pi_req[6] | pi_req[7];
wire pi_enc_33 = pi_req[2] | pi_req[3] | pi_req[6] | pi_req[7];
wire pi_enc_34 = pi_req[1] | pi_req[3] | pi_req[5] | pi_req[7];
// rst (= restore) means the request is to be dismissed
wire pi_blk_rst = ~pi_ov & iot_datai_o; // BLK hasn't completed
wire pi_rst = ir_jrst & ir[9] | pi_cyc & pi_blk_rst;
wire pi_hold = pi_cyc & (~ir_iot | pi_blk_rst);
wire pi_sync;
wire pi_reset;
wire [0:35] pi_iob = { 28'b0, pi_active, pio };
pa pi_pa0(.clk(clk), .reset(reset),
.in(it0 | at0),
.p(pi_sync));
pa pi_pa1(.clk(clk), .reset(reset),
.in(pi_sync & ~pi_cyc | blt_t4),
.p(pir_stb));
pa pi_pa2(.clk(clk), .reset(reset),
.in(mr_start |
pi_select & iobus_cono_clear & iob[23]),
.p(pi_reset));
wire pi_sync_D;
dly200ns pi_dly0(.clk(clk), .reset(reset),
.in(pi_sync),
.p(pi_sync_D));
always @(posedge clk) begin
if(mr_start | et10 & pi_hold) begin
pi_ov <= 0;
pi_cyc <= 0;
end
if(iot_t0a & ar_cry0 & pi_cyc)
pi_ov <= 1;
if(iat0_D0)
pi_cyc <= 1;
if(pi_reset | pi_cono_set & iob[27])
pi_active <= 0;
if(pi_cono_set & iob[28])
pi_active <= 1;
end
/*
* CPA
*/
reg cpa_iot_user;
reg cpa_illeg_op;
reg cpa_non_exist_mem;
reg cpa_clock_enable;
reg cpa_clock_flag;
reg cpa_pc_chg_enable;
reg cpa_pdl_ov;
reg cpa_arov_enable;
reg [33:35] cpa_pia;
wire cpa = iobus_ios == 0;
wire cpa_cono_set = cpa & iobus_cono_set;
wire cpa_status = cpa & iobus_iob_fm_status;
wire cpa_clock_flag_set;
clk60hz cpa_clk(.clk(clk),
.outclk(cpa_clock_flag_set));
wire cpa_req_enable = cpa_illeg_op | cpa_non_exist_mem | cpa_pdl_ov |
cpa_clock_enable & cpa_clock_flag |
cpa_pc_chg_enable & ar_pc_chg_flag |
cpa_arov_enable & ar_ov_flag;
wire [1:7] cpa_req;
// TODO: improve this
genvar j;
generate
for(j = 1; j <= 7; j = j + 1) begin: cpa_req_gen
assign cpa_req[j] = cpa_req_enable & (cpa_pia == j);
end
endgenerate
wire [0:35] cpa_iob = { 18'b0,
1'b0, cpa_pdl_ov, cpa_iot_user, ex_user,
cpa_illeg_op, cpa_non_exist_mem, 1'b0, cpa_clock_enable,
cpa_clock_flag, 1'b0, cpa_pc_chg_enable, ar_pc_chg_flag,
1'b0, cpa_arov_enable, ar_ov_flag,
cpa_pia };
always @(posedge clk) begin
if(mr_start) begin
cpa_iot_user <= 0;
cpa_illeg_op <= 0;
cpa_non_exist_mem <= 0;
cpa_clock_enable <= 0;
cpa_clock_flag <= 0;
cpa_pc_chg_enable <= 0;
cpa_pdl_ov <= 0;
cpa_arov_enable <= 0;
cpa_pia <= 0;
end
if(cpa_cono_set & iob[21])
cpa_iot_user <= 0;
if(cpa_cono_set & iob[20])
cpa_iot_user <= 1;
if(cpa_cono_set & iob[22])
cpa_illeg_op <= 0;
if(mc_illeg_address)
cpa_illeg_op <= 1;
if(cpa_cono_set & iob[23])
cpa_non_exist_mem <= 0;
if(mc_non_exist_mem)
cpa_non_exist_mem <= 1;
if(cpa_cono_set & iob[24])
cpa_clock_enable <= 0;
if(cpa_cono_set & iob[25])
cpa_clock_enable <= 1;
if(cpa_cono_set & iob[26])
cpa_clock_flag <= 0;
if(cpa_clock_flag_set)
cpa_clock_flag <= 1;
if(cpa_cono_set & iob[27])
cpa_pc_chg_enable <= 0;
if(cpa_cono_set & iob[28])
cpa_pc_chg_enable <= 1;
if(cpa_cono_set & iob[18])
cpa_pdl_ov <= 0;
if(et10 & mb_ar_swap_et10 & ar_cry0)
cpa_pdl_ov <= 1;
if(cpa_cono_set & iob[30])
cpa_arov_enable <= 0;
if(cpa_cono_set & iob[31])
cpa_arov_enable <= 1;
if(cpa_cono_set)
cpa_pia <= iob[33:35];
end
endmodule