Black box, empty box, and unknown box

From Verific Design Automation FAQ
Revision as of 18:57, 1 December 2021 by Hoa (Talk | contribs)

Jump to: navigation, search

In the Verific Netlist Database, a Netlist can be a black box, an empty box, or an unknown box (and of course, a "normal" box).

  1. An unknown box is a Netlist that is:
    • from an instantiation of an undefined Verilog module
    • from an instantiation of a VHDL component without binding entity
  2. A black box is a Netlist that contains no Instances (NumOfInsts() == 0) and no Nets ((NumOfNets() == 0). It can be:
    • an unknown box
    • a Verific Primitive or Operator
    • a Netlist that has errors during RTL elaboration
    • set from VeriModule::SetCompileAsBlackbox()
    • set from VhdlPrimaryUnit::SetCompileAsBlackbox()
  3. An empty box is a Netlist that contains no Instances and no port-to-port connections. It can be:
    • a black box
    • a user-defined module/entity with ports but no contents
    • a user-defined module/entity that has no assignments to its outputs

Note that all ports of an unknown box are assumed to be 'inout' due to the lack of data.

If it is desired to have the user-defined module declarations written out into the Verilog output netlist, including those of black boxes and empty boxes, the runtime flag 'db_verilog_writer_write_blackboxes' can be set to different values to control this behavior:

  • value > 1: print all Netlists except Primitives
  • value = 1: print all Netlists except Primitives and Netlists with ' unknown_design' attribute
  • value = 0: print all Netlists except Primitives, Netlists with ' unknown_design' attribute and 'IsBlackBox()' Netlists
  • default value = 0

For more details on how the Verific RTL elaborator handles Instances of unknown boxes, please read How Verific elaborator handles blackboxes/unknown boxes

#include "Set.h"
#include "Message.h"
#include "Strings.h"
#include "veri_file.h"
#include "vhdl_file.h"
#include "VeriModule.h"
#include "VeriWrite.h"
#include "DataBase.h"

#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif

void Accumulate(Netlist *netlist, Set &done) ;

int main() {
    vhdl_file::SetDefaultLibraryPath("../vdbs");

    if (!vhdl_file::Analyze("fromvhdl.vhd")) return 1 ;
    if (!veri_file::Analyze("test.v", veri_file::VERILOG_2K)) return 1 ;

    // blackboxing module "willbeblackboxed"
    VeriModule *tobeblackboxed = veri_file::GetModule("willbeblackboxed");
    tobeblackboxed->SetCompileAsBlackbox();

    veri_file::Elaborate("top");

    Netlist *top = Netlist::PresentDesign() ;
    if (!top) {
        Message::PrintLine("cannot find any handle to the top-level netlist") ;
        return 1 ;
    }

    Message::Msg(VERIFIC_INFO, 0, top->Linefile(), "top level design is '%s(%s)'",
                 top->Owner()->Name(), top->Name()) ;

    // Lets accumulate all netlist
    Set netlists(POINTER_HASH) ;
    Accumulate(top, netlists) ;

    // Iterate over all Netlists in the design
    Netlist *netlist ;
    SetIter si ;
    FOREACH_SET_ITEM(&netlists, si, &netlist) {
        Message::Msg(VERIFIC_INFO, 0, 0, "*** netlist '%s' of cell '%s'", netlist->Name(), netlist->Owner()->Name()) ;
        // What language does it come from?
        if (netlist->GetAttValue(" language")) {
            Message::Msg(VERIFIC_INFO, 0, 0, "       from %s", netlist->GetAttValue(" language"));
        } else {
            Message::Msg(VERIFIC_INFO, 0, 0, "       no language");
        }
        // Is it a Verific primitive or operator?
        if (netlist->IsPrimitive() || netlist->IsOperator()) {
            Message::Msg(VERIFIC_INFO, 0, 0, "       a primitive/operator");
        }
        // Check attribute for unknown box
        const Att *attr = netlist->GetAtt(" unknown_design"); // note the leading space character
        if (attr) {
            if (Strings::compare (attr->Value(),"1")) {
                // attribute value = "1" : instantiated in a Verilog module
                Message::Msg(VERIFIC_INFO, 0, 0, "       an unknown box instantiated in a Verilog module");
            }
            else if (Strings::compare (attr->Value(),"2")) {
                // attribute value = "2" : instantiated in a VHDL architecture
                Message::Msg(VERIFIC_INFO, 0, 0, "       an unknown box instantiated in a VHDL architecture");
            }
        }
        if (netlist->IsBlackBox()) {
            Message::Msg(VERIFIC_INFO, 0, 0, "       a black box");
        }
        if (netlist->IsEmptyBox()) {
            Message::Msg(VERIFIC_INFO, 0, 0, "       an empty box");
        }

    }
    VeriWrite veriWriter;
    veriWriter.WriteFile("netlistout.v", top) ;

    return 0 ;
}

// This function is recursive in nature, and collects all other
// netlists that the incoming netlist depends on in a container.

void Accumulate(Netlist *netlist, Set &done)
{
    if (!netlist) return ; // Ignore NULL netlists

    SetItem *item = done.GetItem(netlist) ;
    if (item) {
        return ; // We've already been here
    }

    Instance *inst ;
    MapIter mi ;
    FOREACH_INSTANCE_OF_NETLIST(netlist, mi, inst) {
        // Now go into the netlist associated with the instance
        Accumulate(inst->View(), done) ;
    }

    done.Insert(netlist) ;
}
  

test.v

module nocontents (input a, output o);
endmodule

module willbeblackboxed (input a, b, output o);
  assign o = a ^ b;
endmodule

module containserror (input a, b, output o);
  assign o = a & b;
  assign o = a | b;
endmodule

module emptybox (input a, output o); // no outputs are driven
  wire i = a;
endmodule

module normal (input a, b, output o);
  assign o = a & b;
endmodule

module top (input i1, i2, i3, i4, i5, i6, i7, i8, i9, ia, ib,
            output o1, o2, o3, o4, o5);
  nocontents u_nocontents (i1, o1);
  willbeblackboxed u_willbeblackboxed (i2, i3, o2);
  containserror u_containserror (i4, i5, o3);
  emptybox u_emptybox (i9, );
  unknownverilog u_unknownverilog (i6, o4);
  normal u_normal (i7, i8, o5);
  fromvhdl u_fromvhdl (ia, ib, o6);
endmodule
 

fromvhdl.vhd:

library std;
use std.all;
entity fromvhdl is
  port ( a, b: in bit; o: out bit );
end entity;
architecture test of fromvhdl is
  component unknownvhdl
    port ( a, b : in bit; o : out bit);
  end component;
begin
  u_unknownvhdl: unknownvhdl port map (a, b, o);
end architecture;
 

Run:

$ test-linux
INFO: The default VHDL library search path is now "/mnt/Verific/extra_tests/vdbs" (VHDL-1504)
-- Analyzing VHDL file 'fromvhdl.vhd' (VHDL-1481)
-- Restoring VHDL parse-tree 'std.standard' from '/mnt/Verific/extra_tests/vdbs/std/standard.vdb' (VHDL-1493)
fromvhdl.vhd(3): INFO: analyzing entity 'fromvhdl' (VHDL-1012)
fromvhdl.vhd(6): INFO: analyzing architecture 'test' (VHDL-1010)
-- Analyzing Verilog file 'test.v' (VERI-1482)
test.v(21): INFO: compiling module 'top' (VERI-1018)
test.v(1): INFO: compiling module 'nocontents' (VERI-1018)
test.v(4): INFO: compiling module 'willbeblackboxed' (VERI-1018)
test.v(8): INFO: compiling module 'containserror' (VERI-1018)
test.v(9): ERROR: net 'o' is constantly driven from multiple places (VDB-1000)
test.v(10): ERROR: another driver from here (VDB-1001)
test.v(8): INFO: module 'containserror' remains a black box, due to errors in its contents (VERI-1073)
test.v(13): INFO: compiling module 'emptybox' (VERI-1018)
test.v(27): WARNING: instantiating unknown module 'unknownverilog' (VERI-1063)
test.v(17): INFO: compiling module 'normal' (VERI-1018)
test.v(29): INFO: going to VHDL side to elaborate design unit 'fromvhdl' (VERI-1231)
fromvhdl.vhd(3): INFO: executing 'fromvhdl(test)' (VHDL-1067)
fromvhdl.vhd(9): WARNING: 'unknownvhdl' remains a black box since it has no binding entity (VHDL-1250)
test.v(29): INFO: back to Verilog to continue elaboration (VERI-1232)
test.v(21): INFO: top level design is top()
INFO: *** netlist '' of cell 'nocontents'
INFO:        from verilog
INFO:        an empty box
INFO: *** netlist '' of cell 'willbeblackboxed'
INFO:        from verilog
INFO:        a black box
INFO:        an empty box
INFO: *** netlist '' of cell 'containserror'
INFO:        from verilog
INFO:        a black box
INFO:        an empty box
INFO: *** netlist 'INTERFACE' of cell 'VERIFIC_BUF'
INFO:        no language
INFO:        a primitive/operator
INFO:        a black box
INFO:        an empty box
INFO: *** netlist '' of cell 'emptybox'
INFO:        from verilog
INFO: *** netlist 'OrderedPorts' of cell 'unknownverilog'
INFO:        no language
INFO:        an unknown box instantiated in a Verilog module
INFO:        a black box
INFO:        an empty box
INFO: *** netlist 'INTERFACE' of cell 'VERIFIC_AND'
INFO:        no language
INFO:        a primitive/operator
INFO:        a black box
INFO:        an empty box
INFO: *** netlist '' of cell 'normal'
INFO:        from verilog
INFO: *** netlist '' of cell 'unknownvhdl'
INFO:        from vhdl
INFO:        an unknown box instantiated in a VHDL architecture
INFO:        a black box
INFO:        an empty box
INFO: *** netlist 'test' of cell 'fromvhdl'
INFO:        from vhdl
INFO: *** netlist '' of cell 'top'
INFO:        from verilog
-- Writing netlist 'top' to Verilog file 'netlistout.v' (VDB-1030)
$