<?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=Bit-blasting_a_multi-port_RAM_instance</id>
		<title>Bit-blasting a multi-port RAM instance - 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=Bit-blasting_a_multi-port_RAM_instance"/>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Bit-blasting_a_multi-port_RAM_instance&amp;action=history"/>
		<updated>2026-05-02T12:27:13Z</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=Bit-blasting_a_multi-port_RAM_instance&amp;diff=460&amp;oldid=prev</id>
		<title>Hoa: Created page with &quot;'''Q: What is bit-blasting a multi-port RAM instance'''  Verific’s RAM extraction creates a minimal-port, multi-port RAM model in the netlist for every identifier that behav...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Bit-blasting_a_multi-port_RAM_instance&amp;diff=460&amp;oldid=prev"/>
				<updated>2020-02-10T23:02:52Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Q: What is bit-blasting a multi-port RAM instance&amp;#039;&amp;#039;&amp;#039;  Verific’s RAM extraction creates a minimal-port, multi-port RAM model in the netlist for every identifier that behav...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''Q: What is bit-blasting a multi-port RAM instance'''&lt;br /&gt;
&lt;br /&gt;
Verific’s RAM extraction creates a minimal-port, multi-port RAM model in the netlist for every identifier that behaves as a RAM in the original RTL design. The decision to implement the identifier as a RAM was done easy on, during the analysis phase, and based on very limited information about the identifier and how it is used in the RTL model.&lt;br /&gt;
&lt;br /&gt;
It is very likely that there will be cases where it is needed to &amp;quot;undo&amp;quot; an extracted RAM. For example, just before mapping a multi port RAM to a target technology, it may turn out that that particular multiport RAM is not available in the target library. Rather than terminating the application, it would then be desirable to &amp;quot;bit-blast&amp;quot; the RamNet and to implement the behavior as a collection of traditional logic like registers, selection logic, etc..&lt;br /&gt;
&lt;br /&gt;
This is why Verific implemented a RamNet &amp;quot;bit-blast&amp;quot; algorithm. This algorithm takes a RamNet with its connected read/write ports and translate this structure into a bit-blasted netlist similar to what would be created if no multiport RAM architecture was inferred in the first place. This &amp;quot;bit-blast&amp;quot; algorithm is implemented under API routine RamNet::BlastNet(). As most other routines on RamNet, this is a virtual routine, so it can be called from the Net base class.&lt;br /&gt;
&lt;br /&gt;
Verific creates operator &amp;quot;enable decoder&amp;quot; (class OperEnabledDecoder : public Operator) when bit-blasting a RamNet.  When a WritePort has a write-enable signal, the bit-blasted logic should infer a decoder with the write address and all the decoded bits gated with the write-enable net. This operator serves that purpose.&lt;br /&gt;
&lt;br /&gt;
Relevant:&lt;br /&gt;
   APIs: Net::BlastNet(), Netlist::BlastRamNets().&lt;br /&gt;
   Tcl command: blast_ram.&lt;br /&gt;
&lt;br /&gt;
ram.v:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
module top (input clk, input write, input [1:0]addr,&lt;br /&gt;
            input [1:0]addr1, input [0:3]data, output reg [0:3] out) ;&lt;br /&gt;
  reg [0:3]ram [3:0] ;&lt;br /&gt;
&lt;br /&gt;
  always @(posedge clk) begin&lt;br /&gt;
    if (write) ram[addr] &amp;lt;= data ;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  always @(posedge clk) begin&lt;br /&gt;
    out &amp;lt;= ram[addr1] ;&lt;br /&gt;
  end&lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tcl script:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
set_runtime_flag &amp;quot;veri_extract_dualport_rams&amp;quot; 0&lt;br /&gt;
set_runtime_flag &amp;quot;veri_extract_multiport_rams&amp;quot; 1&lt;br /&gt;
analyze ram.v&lt;br /&gt;
elaborate&lt;br /&gt;
write netlist.v&lt;br /&gt;
blast_ram&lt;br /&gt;
write blasted_netlist.v&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
netlist.v:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of module top&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module top (clk, write, addr, addr1, data, out);   // ram.v(1)&lt;br /&gt;
    input clk;   // ram.v(1)&lt;br /&gt;
    input write;   // ram.v(1)&lt;br /&gt;
    input [1:0]addr;   // ram.v(1)&lt;br /&gt;
    input [1:0]addr1;   // ram.v(2)&lt;br /&gt;
    input [0:3]data;   // ram.v(2)&lt;br /&gt;
    output [0:3]out;   // ram.v(2)&lt;br /&gt;
    &lt;br /&gt;
    wire [15:0] ram /* Original declaration bounds: [3:0][0:3] */  /* verific ORIG_DEPTH=4, ORIG_WIDTH=4 */ ;   // ram.v(3)&lt;br /&gt;
    &lt;br /&gt;
    wire n7, n8, n9, n10;&lt;br /&gt;
    &lt;br /&gt;
    ClockedWritePort_2_4_3_0_0_3 clk_write_port_4 (.clk(clk), .write_enable(write), &lt;br /&gt;
            .write_address({addr}), .write_data({data}), .Ram(ram));   // ram.v(6)&lt;br /&gt;
    VERIFIC_DFFRS i9 (.d(n8), .clk(clk), .s(1'b0), .r(1'b0), .q(out[1]));   // ram.v(11)&lt;br /&gt;
    VERIFIC_DFFRS i10 (.d(n9), .clk(clk), .s(1'b0), .r(1'b0), .q(out[2]));   // ram.v(11)&lt;br /&gt;
    VERIFIC_DFFRS i11 (.d(n10), .clk(clk), .s(1'b0), .r(1'b0), .q(out[3]));   // ram.v(11)&lt;br /&gt;
    VERIFIC_DFFRS i8 (.d(n7), .clk(clk), .s(1'b0), .r(1'b0), .q(out[0]));   // ram.v(11)&lt;br /&gt;
    ReadPort_2_4_3_0_0_3 read_port_6 (.read_enable(1'b1), .read_address({addr1}), &lt;br /&gt;
            .read_data({n7, n8, n9, n10}), .Ram(ram));   // ram.v(10)&lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of OPERATOR ClockedWritePort_2_4_3_0_0_3&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module ClockedWritePort_2_4_3_0_0_3 (clk, write_enable, write_address, &lt;br /&gt;
            write_data, Ram);&lt;br /&gt;
    input clk;&lt;br /&gt;
    input write_enable;&lt;br /&gt;
    input [1:0]write_address;&lt;br /&gt;
    input [3:0]write_data;&lt;br /&gt;
    output [15:0] Ram;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of OPERATOR ReadPort_2_4_3_0_0_3&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module ReadPort_2_4_3_0_0_3 (read_enable, read_address, read_data, Ram);&lt;br /&gt;
    input read_enable;&lt;br /&gt;
    input [1:0]read_address;&lt;br /&gt;
    output [3:0]read_data;&lt;br /&gt;
    input [15:0] Ram;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
blasted_netlist.v&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of module top&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module top (clk, write, addr, addr1, data, out);   // ram.v(1)&lt;br /&gt;
    input clk;   // ram.v(1)&lt;br /&gt;
    input write;   // ram.v(1)&lt;br /&gt;
    input [1:0]addr;   // ram.v(1)&lt;br /&gt;
    input [1:0]addr1;   // ram.v(2)&lt;br /&gt;
    input [0:3]data;   // ram.v(2)&lt;br /&gt;
    output [0:3]out;   // ram.v(2)&lt;br /&gt;
    &lt;br /&gt;
    wire ram_0_3;   // ram.v(3)&lt;br /&gt;
    wire ram_0_2;   // ram.v(3)&lt;br /&gt;
    wire ram_0_1;   // ram.v(3)&lt;br /&gt;
    wire ram_2_0;   // ram.v(3)&lt;br /&gt;
    wire ram_0_0;   // ram.v(3)&lt;br /&gt;
    wire ram_1_3;   // ram.v(3)&lt;br /&gt;
    wire ram_1_2;   // ram.v(3)&lt;br /&gt;
    wire ram_1_1;   // ram.v(3)&lt;br /&gt;
    wire ram_1_0;   // ram.v(3)&lt;br /&gt;
    wire ram_2_1;   // ram.v(3)&lt;br /&gt;
    wire ram_2_2;   // ram.v(3)&lt;br /&gt;
    wire ram_2_3;   // ram.v(3)&lt;br /&gt;
    wire ram_3_0;   // ram.v(3)&lt;br /&gt;
    wire ram_3_1;   // ram.v(3)&lt;br /&gt;
    wire ram_3_2;   // ram.v(3)&lt;br /&gt;
    wire ram_3_3;   // ram.v(3)&lt;br /&gt;
    &lt;br /&gt;
    wire n21, n22, n23, n24, n25, n26, n27, n28, n29, n34, &lt;br /&gt;
        n39, n44, n49, n54, n59, n64, n69, n74, n79, n84, &lt;br /&gt;
        n89, n94, n99, n104;&lt;br /&gt;
    &lt;br /&gt;
    Mux_2u_4u Mux_18 (.sel({addr1}), .data({ram_3_3, ram_2_3, ram_1_3, &lt;br /&gt;
            ram_0_3}), .o(n25));   // ram.v(10)&lt;br /&gt;
    EnabledDecoder_2 EnabledDecoder_17 (.en(write), .i({addr}), .o({n21, &lt;br /&gt;
            n22, n23, n24}));   // ram.v(6)&lt;br /&gt;
    VERIFIC_DFFRS i9 (.d(n27), .clk(clk), .s(1'b0), .r(1'b0), .q(out[1]));   // ram.v(11)&lt;br /&gt;
    VERIFIC_DFFRS i10 (.d(n26), .clk(clk), .s(1'b0), .r(1'b0), .q(out[2]));   // ram.v(11)&lt;br /&gt;
    VERIFIC_DFFRS i11 (.d(n25), .clk(clk), .s(1'b0), .r(1'b0), .q(out[3]));   // ram.v(11)&lt;br /&gt;
    Mux_2u_4u Mux_19 (.sel({addr1}), .data({ram_3_2, ram_2_2, ram_1_2, &lt;br /&gt;
            ram_0_2}), .o(n26));   // ram.v(10)&lt;br /&gt;
    VERIFIC_DFFRS i8 (.d(n28), .clk(clk), .s(1'b0), .r(1'b0), .q(out[0]));   // ram.v(11)&lt;br /&gt;
    Mux_2u_4u Mux_20 (.sel({addr1}), .data({ram_3_1, ram_2_1, ram_1_1, &lt;br /&gt;
            ram_0_1}), .o(n27));   // ram.v(10)&lt;br /&gt;
    Mux_2u_4u Mux_21 (.sel({addr1}), .data({ram_3_0, ram_2_0, ram_1_0, &lt;br /&gt;
            ram_0_0}), .o(n28));   // ram.v(10)&lt;br /&gt;
    assign n29 = n24 ? data[0] : ram_0_0;   // ram.v(3)&lt;br /&gt;
    assign n34 = n24 ? data[1] : ram_0_1;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i26 (.d(n29), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_0_0));   // ram.v(3)&lt;br /&gt;
    assign n39 = n24 ? data[2] : ram_0_2;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i31 (.d(n34), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_0_1));   // ram.v(3)&lt;br /&gt;
    assign n44 = n24 ? data[3] : ram_0_3;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i36 (.d(n39), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_0_2));   // ram.v(3)&lt;br /&gt;
    assign n49 = n23 ? data[0] : ram_1_0;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i41 (.d(n44), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_0_3));   // ram.v(3)&lt;br /&gt;
    assign n54 = n23 ? data[1] : ram_1_1;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i46 (.d(n49), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_1_0));   // ram.v(3)&lt;br /&gt;
    assign n59 = n23 ? data[2] : ram_1_2;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i51 (.d(n54), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_1_1));   // ram.v(3)&lt;br /&gt;
    assign n64 = n23 ? data[3] : ram_1_3;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i56 (.d(n59), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_1_2));   // ram.v(3)&lt;br /&gt;
    assign n69 = n22 ? data[0] : ram_2_0;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i61 (.d(n64), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_1_3));   // ram.v(3)&lt;br /&gt;
    assign n74 = n22 ? data[1] : ram_2_1;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i66 (.d(n69), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_2_0));   // ram.v(3)&lt;br /&gt;
    assign n79 = n22 ? data[2] : ram_2_2;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i71 (.d(n74), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_2_1));   // ram.v(3)&lt;br /&gt;
    assign n84 = n22 ? data[3] : ram_2_3;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i76 (.d(n79), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_2_2));   // ram.v(3)&lt;br /&gt;
    assign n89 = n21 ? data[0] : ram_3_0;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i81 (.d(n84), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_2_3));   // ram.v(3)&lt;br /&gt;
    assign n94 = n21 ? data[1] : ram_3_1;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i86 (.d(n89), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_3_0));   // ram.v(3)&lt;br /&gt;
    assign n99 = n21 ? data[2] : ram_3_2;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i91 (.d(n94), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_3_1));   // ram.v(3)&lt;br /&gt;
    assign n104 = n21 ? data[3] : ram_3_3;   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i96 (.d(n99), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_3_2));   // ram.v(3)&lt;br /&gt;
    VERIFIC_DFFRS i101 (.d(n104), .clk(clk), .s(1'b0), .r(1'b0), .q(ram_3_3));   // ram.v(3)&lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of OPERATOR Mux_2u_4u&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module Mux_2u_4u (sel, data, o);&lt;br /&gt;
    input [1:0]sel;&lt;br /&gt;
    input [3:0]data;&lt;br /&gt;
    output o;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    wire n1, n2;&lt;br /&gt;
    &lt;br /&gt;
    assign n1 = sel[0] ? data[1] : data[0];&lt;br /&gt;
    assign n2 = sel[0] ? data[3] : data[2];&lt;br /&gt;
    assign o = sel[1] ? n2 : n1;&lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Verific Verilog Description of OPERATOR EnabledDecoder_2&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
module EnabledDecoder_2 (en, i, o);&lt;br /&gt;
    input en;&lt;br /&gt;
    input [1:0]i;&lt;br /&gt;
    output [3:0]o;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    wire n1, n2, n3, n4;&lt;br /&gt;
    &lt;br /&gt;
    not (n1, i[0]) ;&lt;br /&gt;
    not (n2, i[1]) ;&lt;br /&gt;
    and (n3, en, i[0]) ;&lt;br /&gt;
    and (n4, en, n1) ;&lt;br /&gt;
    and (o[2], n4, i[1]) ;&lt;br /&gt;
    and (o[0], n4, n2) ;&lt;br /&gt;
    and (o[3], n3, i[1]) ;&lt;br /&gt;
    and (o[1], n3, n2) ;&lt;br /&gt;
    &lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	</feed>