<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=Memory_elements_of_a_RamNet</id>
		<title>Memory elements of a RamNet - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=Memory_elements_of_a_RamNet"/>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;action=history"/>
		<updated>2026-05-02T12:40:50Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;diff=457&amp;oldid=prev</id>
		<title>Hoa at 00:53, 1 February 2020</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;diff=457&amp;oldid=prev"/>
				<updated>2020-02-01T00:53:14Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;amp;diff=457&amp;amp;oldid=449&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;diff=449&amp;oldid=prev</id>
		<title>Hoa: Created page with &quot;In Verific Netlist Database, a RamNet is created for every identifier in the parsetree that is inferred as multi-port memory.  This example checks what memory elements are con...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Memory_elements_of_a_RamNet&amp;diff=449&amp;oldid=prev"/>
				<updated>2020-01-23T01:06:12Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;In Verific Netlist Database, a RamNet is created for every identifier in the parsetree that is inferred as multi-port memory.  This example checks what memory elements are con...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In Verific Netlist Database, a RamNet is created for every identifier in the parsetree that is inferred as multi-port memory.&lt;br /&gt;
&lt;br /&gt;
This example checks what memory elements are connected to the RamNets.&lt;br /&gt;
&lt;br /&gt;
C++:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;quot;veri_file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Netlist.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Net.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Instance.h&amp;quot;&lt;br /&gt;
#include &amp;quot;PortRef.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Set.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifdef VERIFIC_NAMESPACE&lt;br /&gt;
using namespace Verific ;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
void AnalyzeMultiPortRAM(Netlist* top)&lt;br /&gt;
{&lt;br /&gt;
    // Traverse all the multiport memory nets of the netlist to check the portrefs.&lt;br /&gt;
    Net *net ;&lt;br /&gt;
    MapIter mi ;&lt;br /&gt;
    FOREACH_NET_OF_NETLIST(top, mi, net) {&lt;br /&gt;
        // Only interested in RamNet&lt;br /&gt;
        if (!net || !net-&amp;gt;IsRamNet()) continue ;&lt;br /&gt;
&lt;br /&gt;
        unsigned hasReadPort = 0 ;&lt;br /&gt;
        unsigned hasWritePort = 0 ;&lt;br /&gt;
        unsigned hasClockedWritePort = 0;&lt;br /&gt;
&lt;br /&gt;
        // Traverse all the portrefs of the net to check if the portref is connected to any ram ports.&lt;br /&gt;
        SetIter si ;&lt;br /&gt;
        PortRef *pr ;&lt;br /&gt;
        FOREACH_PORTREF_OF_NET(net,si, pr) {&lt;br /&gt;
            Instance *inst = pr ? pr-&amp;gt;GetInst() : 0 ;&lt;br /&gt;
            if (!inst) continue ;&lt;br /&gt;
&lt;br /&gt;
            if (inst-&amp;gt;Type() == OPER_READ_PORT) {&lt;br /&gt;
                // This net is connected to a memory read port&lt;br /&gt;
                hasReadPort = 1 ;&lt;br /&gt;
            }&lt;br /&gt;
            if (inst-&amp;gt;Type() == OPER_WRITE_PORT) {&lt;br /&gt;
                // This net is connected to a memory write port&lt;br /&gt;
                hasWritePort = 1;&lt;br /&gt;
            }&lt;br /&gt;
            if (inst-&amp;gt;Type() == OPER_CLOCKED_WRITE_PORT) {&lt;br /&gt;
                // This net is connected to a memory clocked write port&lt;br /&gt;
                hasClockedWritePort = 1;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (hasReadPort) Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;RamNet '%s' has read port&amp;quot;, net-&amp;gt;Name()) ;&lt;br /&gt;
        if (hasWritePort) Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;RamNet '%s' has write port&amp;quot;, net-&amp;gt;Name()) ;&lt;br /&gt;
        if (hasClockedWritePort) Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;RamNet '%s' has clocked write port&amp;quot;, net-&amp;gt;Name()) ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    RuntimeFlags::SetVar(&amp;quot;veri_extract_dualport_rams&amp;quot;, 0) ;&lt;br /&gt;
    RuntimeFlags::SetVar(&amp;quot;veri_extract_multiport_rams&amp;quot;, 1) ;&lt;br /&gt;
&lt;br /&gt;
    // Now analyze the Verilog file (into the work library). In case of any error do not process further.&lt;br /&gt;
    if (!veri_file::Analyze(&amp;quot;test.sv&amp;quot;, veri_file::SYSTEM_VERILOG)) return 1 ;&lt;br /&gt;
&lt;br /&gt;
    // RTL elaborate the module.&lt;br /&gt;
    if (!veri_file::Elaborate(&amp;quot;test&amp;quot;, &amp;quot;work&amp;quot;)) return 1 ;&lt;br /&gt;
&lt;br /&gt;
    // Get the top netlist&lt;br /&gt;
    Netlist *top = Netlist::PresentDesign() ;&lt;br /&gt;
&lt;br /&gt;
    if (!top) {&lt;br /&gt;
        Message::Msg(VERIFIC_ERROR, 0, 0, &amp;quot;an error occurred with this example&amp;quot;) ;&lt;br /&gt;
        return 1 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    AnalyzeMultiPortRAM(top) ;&lt;br /&gt;
&lt;br /&gt;
    return 0 ;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test.sv:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
module test (input clk, write, input [6:0]addr, input [7:0]in, output reg [7:0]out, output reg [7:0]out1) ;&lt;br /&gt;
    reg [7:0]RAM[127:0] ;&lt;br /&gt;
    reg [7:0]RAM1[127:0] ;&lt;br /&gt;
    reg [7:0]RAM2[127:0] ;&lt;br /&gt;
&lt;br /&gt;
    always @(posedge clk) begin&lt;br /&gt;
        if (write) begin&lt;br /&gt;
            RAM[addr] = in ;&lt;br /&gt;
            RAM1[addr] = in ;&lt;br /&gt;
        end&lt;br /&gt;
        out = RAM[addr] ;&lt;br /&gt;
        out1 = RAM2[addr] ;&lt;br /&gt;
    end&lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
$ test-linux &lt;br /&gt;
-- Analyzing Verilog file 'test.sv' (VERI-1482)&lt;br /&gt;
test.sv(1): INFO: compiling module 'test' (VERI-1018)&lt;br /&gt;
test.sv(4): WARNING: net 'RAM2' does not have a driver (VDB-1002)&lt;br /&gt;
INFO: RamNet 'RAM' has read port&lt;br /&gt;
INFO: RamNet 'RAM' has clocked write port&lt;br /&gt;
INFO: RamNet 'RAM1' has clocked write port&lt;br /&gt;
INFO: RamNet 'RAM2' has read port&lt;br /&gt;
$&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	</feed>