Skip to content

CGA_MAC_LA1025

Source: Verilog/DELILAH-CPU/CGA_MAC/circuit/CGA_MAC_LA1025.v

Where it sits (Simulation): ND120_TOP > ND120_CORE > ND3202D > CPU_15 > CPU_PROC_32 > CPU_PROC_CGA_33 > CGA > CGA_MAC > CGA_MAC_LA1025 - instance path: CORE.CPU_BOARD.CPU.PROC.CGA.DELILAH.MAC.MAC_LA1025

Used in: CGA_MAC (all tops)

Contains: A02 x16, NAND_GATE x12, NAND_GATE_6_INPUTS, OR_GATE x8, OR_GATE_4_INPUTS x2, R81_EN x2

Module hierarchy - All modules

CGA_MAC_LA1025 symbol

Schematic

Drawn from the Verilog: the yosys netlist of the Simulation (Verilator) build, instance CORE.CPU_BOARD.CPU.PROC.CGA.DELILAH.MAC.MAC_LA1025. Sub-modules are boxes (click the picture to open it full size; there every sub-module box links to its page, and every wire shows its Verilog name).

CGA_MAC_LA1025 schematic

Description

ND120 CGA (CPU Gate Array / DELILAH) /CGA/MAC/LA1025 ADD Page 40 SHEET 1 of 1 Last reviewed: 02-FEB-2025 Ronny Hansen 02-FEB-2025 - Refactored and removed input bus PCR_15_0_N. (Use bus PCR_15_0 only)

Ports

Direction Width Name Description
input 1 sysclk FPGA system clock (P2: MCLK_EN capture)
input 1 MCLK_EN MCLK clock-enable pulse (FPGA_FF_MODE, else 0)
input 1 A10
input 1 A1617
input 1 A1619
input 1 A1819
input 1 B1819
input 1 B1821
input 1 BB10 no PONI + DOUBLE + SHADOW + MREQ
input 1 C10 no PONI + DOUBLE + SHADOW + not MREQ
input 1 D1617
input 1 E1617
input 1 F1617
input [15:0] ICA_15_0
input 1 MCLK Master CLock (from CGA_MAC.MCLK)
input [15:0] PCR_15_0 Program Counter Register bits 15 to 0 (same net as CGA_MAC.PCR_15_0)
input [7:0] SEG_7_0
input [1:0] XPT_1_0
output 1 ECCRHIN
output [13:0] LA_23_10 Latch Address bits 23 to 10 (to CGA_MAC.LA_23_10)

Verilog source

Verilog/DELILAH-CPU/CGA_MAC/circuit/CGA_MAC_LA1025.v on GitHub.

Show the Verilog of CGA_MAC_LA1025 (616 lines)
/**************************************************************************
** ND120 CGA (CPU Gate Array / DELILAH)                                  **
** /CGA/MAC/LA1025                                                       **
** ADD                                                                   **
**                                                                       **
** Page 40                                                               **
** SHEET 1 of 1                                                          **
**                                                                       **
** Last reviewed: 02-FEB-2025                                            **
** Ronny Hansen                                                          **
**                                                                       **
** 02-FEB-2025 - Refactored and removed input bus PCR_15_0_N.            **
**               (Use bus PCR_15_0 only)                                 **
***************************************************************************/


module CGA_MAC_LA1025 (
    input        sysclk,   //! FPGA system clock (P2: MCLK_EN capture)
    input        MCLK_EN,  //! MCLK clock-enable pulse (FPGA_FF_MODE, else 0)

    input        A10,
    input        A1617,
    input        A1619,
    input        A1819,
    input        B1819,
    input        B1821,
    input        BB10,        //! no PONI + DOUBLE + SHADOW + MREQ
    input        C10,         //! no PONI + DOUBLE + SHADOW + not MREQ
    input        D1617,
    input        E1617,
    input        F1617,
    input [15:0] ICA_15_0,
    input        MCLK,     //! Master CLock (from CGA_MAC.MCLK)
    input [15:0] PCR_15_0,  //! Program Counter Register bits 15 to 0 (same net as CGA_MAC.PCR_15_0)
    input [ 7:0] SEG_7_0,
    input [ 1:0] XPT_1_0,


    output        ECCRHIN,
    output [13:0] LA_23_10  //! Latch Address bits 23 to 10 (to CGA_MAC.LA_23_10)
);

  /*******************************************************************************
   ** The wires are defined here                                                 **
   *******************************************************************************/
  wire [15:0] s_ica_15_0;
  wire [15:0] s_ica_input;
  wire [13:0] s_la_23_10_out;
  wire [15:0] s_pcr_15_0;
  wire [ 1:0] s_xpt_1_0;
  wire [ 7:0] s_seg_7_0;
  wire        s_a10;
  wire        s_a1617;
  wire        s_a1619;
  wire        s_a1819;
  wire        s_b1819;
  wire        s_b1821;
  wire        s_bb10;
  wire        s_ila10_b;
  wire        s_ila11_b;
  wire        s_ila12_b;
  wire        s_ila13_b;
  wire        s_ila14_b;
  wire        s_ila15_b;
  wire        s_c10;
  wire        s_d1617;
  wire        s_e1617;
  wire        s_eccrhi_n_out;
  wire        s_ila16_d_z;
  wire        s_ila17_d_z;
  wire        s_f1617;
  wire        s_ica_10_n;
  wire        s_ica_9_n;
  wire        s_ila10_a;
  wire        s_ila11_a;
  wire        s_ila12_a;
  wire        s_ila13_a;
  wire        s_ila14_a;
  wire        s_ila15_a;
  wire        s_ica6_7_z;
  wire        s_ila17_a_z;
  wire        s_ila10;
  wire        s_ila11;
  wire        s_ila12;
  wire        s_ila13;
  wire        s_ila14;
  wire        s_ila15;
  wire        s_ila16_b_z;
  wire        s_ila16_c_z;
  wire        s_ila16;
  wire        s_ila17_b_z;
  wire        s_ila17_c_z;
  wire        s_ila17;
  wire        s_ila18_a_z;
  wire        s_ila18_b_z;
  wire        s_ila18;
  wire        s_ila19_a_z;
  wire        s_ila19_b_z;
  wire        s_ila19;
  wire        s_ila20_n;
  wire        s_ila21_n;
  wire        s_ila22_n;
  wire        s_ila23_n;
  wire        s_la10_n;
  wire        s_la11_n;
  wire        s_la12_n;
  wire        s_la13_n;
  wire        s_la14_n;
  wire        s_mclk;

  /*******************************************************************************
   ** Here all input connections are defined                                     **
   *******************************************************************************/


  //assign s_ica_15_0[15:0]   = ICA_15_0;
  assign s_ica_input[15:0]   = ICA_15_0;
  assign s_pcr_15_0[15:0]   = PCR_15_0;
  assign s_xpt_1_0[1:0]     = XPT_1_0;
  assign s_seg_7_0[7:0]     = SEG_7_0;
  assign s_a10              = A10;
  assign s_a1617            = A1617;
  assign s_a1619            = A1619;
  assign s_a1819            = A1819;
  assign s_b1819            = B1819;
  assign s_b1821            = B1821;
  assign s_bb10             = BB10;
  assign s_c10              = C10;
  assign s_d1617            = D1617;
  assign s_e1617            = E1617;
  assign s_f1617            = F1617;
  assign s_mclk             = MCLK;

  // P2 (docs/plan-fix-unconstrained-clocks.md): in FF mode the MCLK-
  // clocked registers capture on posedge sysclk gated by MCLK_EN
  // (aligned to the MCLK rise) instead of clocking on the routed net.
`ifdef FPGA_FF_MODE
  localparam MCLK_CE = 1;
`else
  localparam MCLK_CE = 0;
`endif

  /*******************************************************************************
   ** Here all output connections are defined                                    **
   *******************************************************************************/
  assign ECCRHIN            = s_eccrhi_n_out;
  assign LA_23_10           = s_la_23_10_out[13:0];

  /*******************************************************************************
   ** Here all in-lined components are defined                                   **
   *******************************************************************************/

  // NOT Gate
  assign s_ica_9_n          = ~s_ica_15_0[9];
  assign s_ica_10_n         = ~s_ica_15_0[10];


  // Code to make LINTER _not_ complain about bits not read in PCR bits 15 and 6:0
  (* keep = "true", DONT_TOUCH = "true" *) wire [7:0] unused_PCR_bits;
  assign unused_PCR_bits[7:0] = { s_pcr_15_0[15], s_pcr_15_0[6:0]};


  /*******************************************************************************
   ** Implementation                                                            **
   *******************************************************************************/

   // Need to delay the ICA signal change
   // TODO: Review to see if the delay can be latched on posedge sysclk
   reg [15:0] regICA;

   always@(s_ica_input)
   begin
     regICA <= s_ica_input;
   end
   assign s_ica_15_0 = regICA;

  // *** ILA 23 ***

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA23_NAND (
      .input1(s_seg_7_0[7]),
      .input2(s_a1617),
      .result(s_ila23_n)
  );

  // *** ILA 22 ***

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA22_NAND (
      .input1(s_seg_7_0[6]),
      .input2(s_a1617),
      .result(s_ila22_n)
  );

  // *** ILA 21 ***

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA21_NAND (
      .input1(s_seg_7_0[5]),
      .input2(s_b1821),
      .result(s_ila21_n)
  );

  // *** ILA 20 ***

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA20_NAND (
      .input1(s_seg_7_0[4]),
      .input2(s_b1821),
      .result(s_ila20_n)
  );

  // *** ILA 19 ***

  A02 ILA19A (
      .A(s_a1619),
      .B(~s_pcr_15_0[14]),  // PCR 14n
      .C(s_seg_7_0[3]),      // SEG 3
      .D(s_b1821),
      .Z(s_ila19_a_z)
  );

  A02 ILA19B (
      .A(s_ica_10_n),        // ICA 10n
      .B(s_a1819),
      .C(~s_pcr_15_0[10]),   // PCR 10n
      .D(s_b1819),
      .Z(s_ila19_b_z)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA19_OR (
      .input1(s_ila19_a_z),
      .input2(s_ila19_b_z),
      .result(s_ila19)
  );

  // *** ILA 18 ***

  A02 ILA18A (
      .A(s_a1619),
      .B(~s_pcr_15_0[13]),  // PCR 13n
      .C(~s_pcr_15_0[9]),   // PCR 9n
      .D(s_b1819),
      .Z(s_ila18_a_z)
  );

  A02 ILA18B (
      .A(s_seg_7_0[2]),  // SEG 2
      .B(s_b1821),
      .C(s_ica_9_n),  // ICA 9n
      .D(s_a1819),
      .Z(s_ila18_b_z)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA18_OR (
      .input1(s_ila18_a_z),
      .input2(s_ila18_b_z),
      .result(s_ila18)
  );

  // *** ILA 17 ***


  A02 ILA17A (
      .A(s_ica_15_0[7]),
      .B(s_a10),
      .C(s_ica_15_0[8]),
      .D(s_bb10),
      .Z(s_ila17_a_z)
  );

  A02 ILA17B (
      .A(s_pcr_15_0[12]),  // PCR 12
      .B(s_a1619),
      .C(s_seg_7_0[1]),    // SEG 1
      .D(s_a1617),
      .Z(s_ila17_b_z)
  );

  A02 ILA17C (
      .A(s_pcr_15_0[10]),  // PCR 10
      .B(s_d1617),
      .C(s_pcr_15_0[8]),   // PCR 8
      .D(s_e1617),
      .Z(s_ila17_c_z)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA17D (
      .input1(s_xpt_1_0[1]),  // XPT 1
      .input2(s_f1617),
      .result(s_ila17_d_z)
  );


  OR_GATE_4_INPUTS #(
      .BubblesMask(4'hF)
  ) ILA17_OR (
      .input1(s_ila17_a_z),
      .input2(s_ila17_b_z),
      .input3(s_ila17_c_z),
      .input4(s_ila17_d_z),
      .result(s_ila17)
  );

  // *** ILA 16 ***

  A02 ILA16A (
      .A(s_ica_15_0[6]),  // ICA 6
      .B(s_a10),
      .C(s_ica_15_0[7]),  // ICA 7
      .D(s_bb10),
      .Z(s_ica6_7_z)
  );

  A02 ILA16B (
      .A(s_pcr_15_0[11]),  // PCR 11
      .B(s_a1619),
      .C(s_seg_7_0[0]),    // SEG 0
      .D(s_a1617),
      .Z(s_ila16_b_z)
  );


  A02 ILA16C (
      .A(s_pcr_15_0[9]),  //PCR 9
      .B(s_d1617),
      .C(s_pcr_15_0[7]),  // PCR 7
      .D(s_e1617),
      .Z(s_ila16_c_z)
  );


  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA16D (
      .input1(s_xpt_1_0[0]),  // XPT 0
      .input2(s_f1617),
      .result(s_ila16_d_z)
  );

  OR_GATE_4_INPUTS #(
      .BubblesMask(4'hF)
  ) GATES_21 (
      .input1(s_ica6_7_z),
      .input2(s_ila16_b_z),
      .input3(s_ila16_c_z),
      .input4(s_ila16_d_z),
      .result(s_ila16)
  );


  // *** ILA 15 ***

  A02 ILA15A (
      .A(s_ica_15_0[5]),
      .B(s_a10),
      .C(s_ica_15_0[6]),
      .D(s_bb10),
      .Z(s_ila15_a)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA15B (
      .input1(s_ica_15_0[15]),
      .input2(s_c10),
      .result(s_ila15_b)
  );


  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA15_OR (
      .input1(s_ila15_a),
      .input2(s_ila15_b),
      .result(s_ila15)
  );


  // *** ILA 14 ***
  A02 ILA14A (
      .A(s_ica_15_0[4]),
      .B(s_a10),
      .C(s_ica_15_0[5]),
      .D(s_bb10),
      .Z(s_ila14_a)
  );
  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA14B (
      .input1(s_ica_15_0[14]),
      .input2(s_c10),
      .result(s_ila14_b)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA14_OR (
      .input1(s_ila14_a),
      .input2(s_ila14_b),
      .result(s_ila14)
  );

  // *** ILA 13 ***

  A02 ILA13A (
      .A(s_ica_15_0[3]),
      .B(s_a10),
      .C(s_ica_15_0[4]),
      .D(s_bb10),
      .Z(s_ila13_a)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA13B (
      .input1(s_ica_15_0[13]),
      .input2(s_c10),
      .result(s_ila13_b)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA13_OR (
      .input1(s_ila13_a),
      .input2(s_ila13_b),
      .result(s_ila13)
  );

  // *** ILA 12 ***

  A02 ILA12A (
      .A(s_ica_15_0[2]),
      .B(s_a10),
      .C(s_ica_15_0[3]),
      .D(s_bb10),
      .Z(s_ila12_a)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA12B (
      .input1(s_ica_15_0[12]),
      .input2(s_c10),
      .result(s_ila12_b)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA12_OR (
      .input1(s_ila12_a),
      .input2(s_ila12_b),
      .result(s_ila12)
  );


  // *** ILA 11 ***

  A02 ILA11A (
      .A(s_ica_15_0[1]),
      .B(s_a10),
      .C(s_ica_15_0[2]),
      .D(s_bb10),
      .Z(s_ila11_a)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) GATES_3 (
      .input1(s_ica_15_0[11]),
      .input2(s_c10),
      .result(s_ila11_b)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA11_OR (
      .input1(s_ila11_a),
      .input2(s_ila11_b),
      .result(s_ila11)
  );


  // *** ILA 10 ***

  A02 ILA10A (
      .A(s_ica_15_0[0]),
      .B(s_a10),
      .C(s_ica_15_0[1]),
      .D(s_bb10),
      .Z(s_ila10_a)
  );

  NAND_GATE #(
      .BubblesMask(2'b00)
  ) ILA10B (
      .input1(s_ica_15_0[10]),
      .input2(s_c10),
      .result(s_ila10_b)
  );

  OR_GATE #(
      .BubblesMask(2'b11)
  ) ILA10_OR (
      .input1(s_ila10_a),
      .input2(s_ila10_b),
      .result(s_ila10)
  );

  // *******************













  NAND_GATE_6_INPUTS #(
      .BubblesMask({2'b00, 4'h0})
  ) GATES_23 (
      .input1(s_la_23_10_out[5]),
      .input2(s_la10_n),
      .input3(s_la11_n),
      .input4(s_la12_n),
      .input5(s_la13_n),
      .input6(s_la14_n),
      .result(s_eccrhi_n_out)
  );




  // *** LATCHES ***


  // ** HIGH-LATCH (LA_23-18)**
  R81_EN #(.USE_ENABLE(MCLK_CE)) R_LA_H (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CP(s_mclk),

      .A  (1'b0),
      .B  (1'b0),
      .C  (s_ila23_n),
      .D  (s_ila22_n),
      .E  (s_ila21_n),
      .F  (s_ila20_n),
      .G  (s_ila19),
      .H  (s_ila18),
      .QA (),
      .QAN(),
      .QB (),
      .QBN(),
      .QC (),
      .QCN(s_la_23_10_out[13]),
      .QD (),
      .QDN(s_la_23_10_out[12]),
      .QE (),
      .QEN(s_la_23_10_out[11]),
      .QF (),
      .QFN(s_la_23_10_out[10]),
      .QG (s_la_23_10_out[9]),
      .QGN(),
      .QH (s_la_23_10_out[8]),
      .QHN()
  );

  // ** LOW-LATCH (LA_17-10)**
  R81_EN #(.USE_ENABLE(MCLK_CE)) R_LA_L (
      .sysclk(sysclk),
      .EN(MCLK_EN),
      .CP(s_mclk),

      .A  (s_ila17),
      .B  (s_ila16),
      .C  (s_ila15),
      .D  (s_ila14),
      .E  (s_ila13),
      .F  (s_ila12),
      .G  (s_ila11),
      .H  (s_ila10),
      .QA (s_la_23_10_out[7]),
      .QAN(),
      .QB (s_la_23_10_out[6]),
      .QBN(),
      .QC (s_la_23_10_out[5]),
      .QCN(),
      .QD (s_la_23_10_out[4]),
      .QDN(s_la14_n),
      .QE (s_la_23_10_out[3]),
      .QEN(s_la13_n),
      .QF (s_la_23_10_out[2]),
      .QFN(s_la12_n),
      .QG (s_la_23_10_out[1]),
      .QGN(s_la11_n),
      .QH (s_la_23_10_out[0]),
      .QHN(s_la10_n)
  );

endmodule