I've received enough calls and emails that my previous communications haven't been clear. Here's are three examples of back annotation methods that Scott and I went through, and hopefully it will clear up some confusion. In each example, the only language features needed are resolution functions tied to a type, and user-defined types on ports. Feel free to call or email me if there are any questions.
In modeling parasitic resistance between three devices, a distributed parasitic resistance provided by the drives will solve the problem very accurately. For example, consider this Thevenin driver module and interconnect:
module driver #(parameter rParasitic=0.0) (Thev_t w1);
initial w1 <= {internalDriverVoltage, inernalDriverResistance+rParasitic);
endmodule
module BackAnnotatedNetlist ();
parameter rParasitic1 = 1.2e3;
parameter rParasitic2 = 1.5e3;
parameter rParasitic2 = 1.8e3;
Thev_t interconnectNet;
driver #(rParasitic1) inst1(interconnectNet);
driver #(rParasitic2) inst2(interconnectNet);
driver #(rParasitic3) inst3(interconnectNet);
endmodule
This is a trivial case and the accuracy degrades for more interconnect branches. For more devices, the branches of the wires get complicated. In this case, actual discrete resistances and/or capacitors can be used. There's probably a limit to how many discrete devices one would be able to use for a net, but that's difficult to determine without a lot of investigation. Here is an example of such an netlist in which three driver devices and two resistors are connected in a Daisy chain (one resistance between driver 1 and driver 2, and a second resistor between driver 2 and driver 3). The resistors are similar to the discrete resistor example I provided in VHDL. Other wiring parasitic topologies are implemented in similar ways.
module BackAnnotatedNetlist ();
parameter rParasitic1 = 1.2e3;
parameter rParasitic2 = 1.5e3;
Thev_t interconnectBranch1, interconnectBranch2, interconnectBranch3;
driver #(0) inst1(interconnectBranch1);
resistor #(rParasitic1) branch1(interconnectBranch1, interconnectBranch2);
driver #(0) inst2(interconnectBranch2);
resistor #(rParasitc2) branch2(interconnectBranch2, interconnectBranch3);
driver #(0) inst3(interconnectBranch3);
endmodule
Finally, to solve Achim's desire to have a module for the interconnect, we simply instantiate one specific to an interconnect. This interconnect module can also take in heterogeneous driver types. However, it can not always be implemented in a hierarchically accurate netlist. It must be a flat netlist. This may be a problem in some cases. Maybe someone can comment if this is a concern.
module BackAnnotatedNetlist ();
parameter rParasitic1 = 1.2e3;
parameter rParasitic2 = 1.5e3;
Thev_t interconnectBranch1, interconnectBranch2, interconnectBranch3;
driver #(0) inst1(interconnectBranch1);
driver #(0) inst2(interconnectBranch2);
driver #(0) inst3(interconnectBranch3);
interconnectModel123 #(rParasitic1, rParasitic2) interconnect(interconnectBranch1, interconnectBranch2, interconnectBranch3);
endmodule
Kindest Regards,
Jim Lear
Cirrus Logic
(512) 851-4612
(512) 293-7248 (mobile)
-- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.Received on Thu Feb 10 12:46:04 2011
This archive was generated by hypermail 2.1.8 : Thu Feb 10 2011 - 12:46:05 PST