<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Olivier Coudert&#039;s Blog &#187; Tech</title>
	<atom:link href="http://www.ocoudert.com/blog/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ocoudert.com/blog</link>
	<description>My take on tech --and other topics</description>
	<lastBuildDate>Tue, 07 Sep 2010 12:08:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>How to write abstract iterators in C++</title>
		<link>http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/</link>
		<comments>http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 21:18:32 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=859</guid>
		<description><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a></p>
<p>When developing in C++, an <a href="../2009/10/08/api-design-101/" rel="nofollow" >impeccable API</a> is a must have: it has to be as simple as possible, abstract, generic, and extensible. One important generic concept that STL made C++ developers familiar with is the concept of iterator.</p>
<p>An iterator is used to visit the elements of [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/">How to write abstract iterators in C++</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/08/api-design-101/' rel='bookmark' title='Permanent Link: API design 101'>API design 101</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a></p>
<p>When developing in C++, an <a href="../2009/10/08/api-design-101/" rel="nofollow" >impeccable API</a> is a must have: it has to be as simple as possible, abstract, generic, and extensible. One important generic concept that STL made C++ developers familiar with is the concept of iterator.</p>
<p>An iterator is used to visit the elements of a container without exposing how the container is implemented (e.g., a vector, a list, a red-black tree, a hash set, a queue, etc). Iterators are central to generic programming because they are an interface between containers and applications. Applications need access to the elements of containers, but they usually do not need to know how elements are stored in containers. Iterators make possible to write generic algorithms that operate on different kinds of containers.</p>
<p>For example, the following code snippet exposes the nature of the container –a vector.</p>
<pre style="color: #000000; background-color: #ffe3c1;" lang="cpp">     void process(const std::vector&lt;E&gt;&amp; v)
     {
         for (unsigned i = 0; i &lt; v.size(); ++i) {
             process(v[i]);
         }
     }</pre>
<p>If we want to have the same function operating on a list, we have to write a separate function. Or if we later decide that a list or a hash set is more appropriate as a container, we need to rewrite the code everywhere we access the vector. This may require a lot of changes in many files. Contrast this container-specific visitation scheme to the following:</p>
<pre style="color: #000000; background-color: #ffe3c1;">     template &lt;typename Container&gt;
     void process(const Container&amp; c)
     {
         typename Container::const_iterator itr = c.begin();
         typename Container::const_iterator end = c.end();
         for (; itr != end; ++itr) {
             process(*itr);
         }
     }</pre>
<p>Using the notion of iterator, we have a generic processing of a container ‘c’, whether it is a vector, a list, a hash set, or any data structure that provides iterators in its API. Even better, we can write a generic process function that only takes an iterator range, without assuming that the container has a begin() and end() method:</p>
<pre style="color: #000000; background-color: #ffe3c1;">     template &lt;typename Iterator&gt;
     void process(Iterator begin, Iterator end)
     {
         for (; itr != end; ++itr) {
             process(*itr);
         }
     }</pre>
<p>An STL iterator is a commodity that behaves as a scalar type:</p>
<ul>
<li>It can      be allocated on the heap</li>
<li>It can      be copied</li>
<li>It can      be passed by value</li>
<li>It can      be assigned to</li>
</ul>
<p>The essence of an iterator is captured by the following API.</p>
<pre style="color: #000000; background-color: #ffe3c1;">     template &lt;typename T&gt;
     class Itr {
     public:
         Itr();
         ~Itr();
         Itr(const Itr&amp; o);                   <span style="color: #ff0000;">// Copy constructor</span>
         Itr&amp; operator=(const Itr&amp; o);        <span style="color: #ff0000;">// Assignment operator</span>
         Itr&amp; operator++();                   <span style="color: #ff0000;">// Next element</span>
         T&amp;   operator*();                    <span style="color: #ff0000;">// Dereference</span>
         bool operator==(const Itr&amp; o) const; <span style="color: #ff0000;">// Comparison</span>
         bool operator!=(const Itr&amp; o) const { return !(*this == o); }
     }</pre>
<p>Usually the container will provide a begin() and end() method, which build the iterators that denote the container’s range. Writing these begin/end methods is an easy task if the container is derived from a STL container, if the container has a data member that is an STL container, or if the iterator is a scalar type, like a pointer or an index.</p>
<p>It is more complicated if we want iterators that dereference to the same type of object, but that must visit several containers, possibly of different types, or iterators that visit containers in different manners. For instance let us assume that we have objects with some property (say, a color) stored in several containers, some of them of different types. We would like to visit all the objects, independently of the number of containers and their type, or we would like to visit objects of a given color, or we would like to visit objects that satisfy some predicate:</p>
<pre style="color: #000000; background-color: #ffe3c1;">     class E;

     Itr&lt;E&gt; begin(); <span style="color: #ff0000;">// This give the range to visit</span>
     Itr&lt;E&gt; end();   <span style="color: #ff0000;">// all the elements of type E  </span>    

     Itr&lt;E&gt; begin(const Color&amp; color); <span style="color: #ff0000;">// Same as above but only for the</span>
     Itr&lt;E&gt; end(const Coir&amp; color);    <span style="color: #ff0000;">// elements of the given color</span>      

     class Predicate {
     public:
         bool operator()(const E&amp; e);
     };      

     Itr&lt;E&gt; begin(Predicate&amp; p); <span style="color: #ff0000;">// Same as above but only for the</span>
     Itr&lt;E&gt; end(Predicate&amp; p);   <span style="color: #ff0000;">// elements that satisfy the predicate</span></pre>
<p>In this case the iterator is more complex than a scalar type like a pointer or an index: it needs to keep track of which container it is currently visiting, or which color or predicate it needs to check. In general, the iterator may have data members so that it can fulfill its task. Also we want to factorize the code and reuse general purpose iterators’ methods when writing more targeted iterators –e.g., visiting elements of a specific color should make use of the next-element method Itr&lt;E&gt;::operator++(). This can be done by having Itr&lt;E&gt; be a virtual class, and having derived classes to implement the different iterators. For example:</p>
<pre style="color: #000000; background-color: #ffe3c1;">     class E {
     public:
         Color&amp; color() const;
     };      

     template &lt;typename E&gt;
     class ColoredItr&lt;E&gt; : public Itr&lt;E&gt; {
     private:
         typedef Itr&lt;E&gt; _Super;
     public:
         ColoredItr&lt;E&gt;(const Color&amp; color) : Itr&lt;E&gt;(), color_(color) {}
         virtual ~ColoredItr&lt;E&gt;;
         virtual ColoredItr&lt;E&gt;&amp; Operator++() {
            for (; _Super::operator*().color() != color_; _Super::operator++());
            return *this;
         }
     private:
         Color color_;
    };</pre>
<p>We would like a generic iterator that meets all the requirements described above:</p>
<ul>
<li>It can      be allocated on the heap</li>
<li>It can      be copied</li>
<li>It can      be passed by value</li>
<li>It can      be assigned to</li>
<li>It dereferences      to the same type</li>
<li>It can      visit several containers</li>
<li>It can      visit containers of different types</li>
<li>It can      visit containers in arbitrary manners</li>
</ul>
<p>This can be implemented as follows.</p>
<pre style="color: #000000; background-color: #ffe3c1;">     template&lt;typename E&gt;
     class ItrBase {
     public:
         ItrBase() {}
         virtual ~ItrBase() {}
         virtual void  operator++() {}
         virtual E&amp;    operator*() const { return E(); }
         virtual ItrBase* clone() const { return new ItrBase(*this); }
         <span style="color: #ff0000;">// The == operator is non-virtual. It checks that the
         // derived objects have compatible types, then calls the
         // virtual comparison function equal.</span>
         bool operator==(const ItrBase&amp; o) const {
             return typeid(*this) == typeid(o) &amp;&amp; equal(o);
         }
     protected:
         virtual bool equal(const ItrBase&amp; o) const { return true; }
     };      

     template&lt;typename E&gt;
     class Itr {
     public:
         Itr() : itr_(0) {}
         ~Itr() { delete itr_; }
         Itr(const Itr&amp; o) : itr_(o.itr_-&gt;clone()) {}
         Itr&amp; operator=(const Itr&amp; o) {
             if (itr_ != o.itr_) { delete itr_; itr_ = o.itr_-&gt;clone(); }
             return *this;
         }
         Itr&amp;  operator++() { ++(*itr_); return *this; }
         E&amp;    operator*() const { return *(*itr_); }
         bool  operator==(const Itr&amp; o) const {
             return (itr_ == o.itr_) || (*itr_ == *o.itr_);
         }
         bool  operator!=(const Itr&amp; o) const { return !(*this == o); }      

     protected:
         ItrBase&lt;E&gt;* itr_;
     };</pre>
<p>The ItrBase class is the top class of the hierarchy. Itr is simply a wrapper on a pointer to an ItrBase, so that it can be allocated on the heap –the actual implementation of the class deriving from ItrBase can have an arbitrary size. Note how the Itr copy and assignment operators are implemented via the ItrBase::clone() method, so that Itr behaves as a scalar type. Last but not least, the (non-virtual) ItrBase::operator== equality operator first checks for type equality before calling the (virtual) equality method equal on the virtual subclass. The reason ItrBase is not a pure virtual is that it can conveniently be used to denote an empty range, i.e., the range (ItrBase(), ItrBase()) is empty.</p>
<p>Iterators on containers of elements of type E just need to derive from ItrBase&lt;E&gt;, and a factory providing the begin() and end() methods for any specialized iterator returns object of type Itr&lt;E&gt;.</p>
<p>For example, let us assume that we have a container c of E&#8217;s, and that we want an iterator to visit (1) all the elements of c, possibly with repetition; (2) all the elements of c without repetition. This can be done as follows.</p>
<pre style="color: #000000; background-color: #ffe3c1;">    class E;

    class ItrAll : public ItrBase&lt;E&gt; {
    private:
        typedef ItrAll     _Self;
        typedef ItrBase&lt;E&gt; _Super;
    public:
        ItrAll(Container&amp; c) : _Super(), c_(c) {}
        virtual ~ItrAll() {}
        virtual void  operator++() { ++itr_; }
        virtual E&amp;    operator*() const { return *itr_; }
        virtual ItrBase&lt;E&gt;* clone() const { return new _Self(*this); }
    protected:
        virtual bool equal(const ItrBase&lt;E&gt;&amp; o) const {
            <span style="color: #ff0000;">// Casting is safe since types have been checked by _Super::operator==</span>
            const _Self&amp; o2 = static_cast&lt;const _Self&amp;&gt;(o);
            return &amp;c_ == &amp;o2.c_ &amp;&amp; itr_ == o2.itr_;
        }
    protected:
        Container&amp;          c_;
        Container::iterator itr_;
    };     

    class ItrNoRepeat : public ItrAll {
    private:
        typedef ItrNoRepeat _Self;
        typedef ItrAll      _Super;
    public:
        ItrNoRepeat (Container&amp; c) : _Super(c) {}
        virtual ~ItrNoRepeat () {}
        virtual void  operator++() {
            _Super::operator++(); <span style="color: #ff0000;">// Go to the next element then
            // look for an element that has not been visited yet.</span>
            for (; itr_ != c_.end(); _Super::operator++()) {
                E&amp; e = _Super::operator*();
                if (visited_.find(e) == visited_.end()) {
                    visited_.insert(e);
                    return;
                }
            }
        }
        virtual E&amp;    operator*() const { return _Super::operator*(); }
        virtual ItrBase&lt;E&gt;* clone() const { return new _Self(*this); }
    protected:
        virtual bool equal(const ItrBase&lt;E&gt;&amp; o) const { return _Super::equal(o); }
    protected:
        set&lt;E&gt; visited_;
    };     

    <span style="color: #ff0000;">// Build the container’s range w/ and w/o repetition</span>
    Itr&lt;E&gt; begin(Container&amp; c, bool noRepeat = false)
    {
        Itr&lt;E&gt; o;
        if (noRepeat) {
            o.itr_ = new ItrNoRepeat(c);
        } else {
            o.itr_ = new ItrAll(c);
        }
        o.itr_-&gt;itr_ = c.begin();
        return o;
    }     

    Itr&lt;E&gt; end(Container&amp; c, bool noRepeat = false)
    {
        Itr&lt;E&gt; o;
        if (noRepeat) {
            o.itr_ = new ItrNoRepeat(c);
        } else {
            o.itr_ = new ItrAll(c);
        }
        o.itr_-&gt;itr_ = c.end();
        return o;
    }</pre>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/08/api-design-101/' rel='bookmark' title='Permanent Link: API design 101'>API design 101</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Can Tabula and Tier Logic be successful?</title>
		<link>http://www.ocoudert.com/blog/2010/03/12/can-tabula-and-tier-logic-be-successful/</link>
		<comments>http://www.ocoudert.com/blog/2010/03/12/can-tabula-and-tier-logic-be-successful/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 13:08:03 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Altera]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=753</guid>
		<description><![CDATA[<p>The past two weeks were pretty interesting if you follow FPGAs. Yes, Xilinx and Altera kept upping their target to Wall St., but that is not where the excitement came from. It came from the recent announcements of two startups, both created in 2003 and heavily funded. <a href="http://www.tabula.com/"rel="nofollow" >Tabula</a> released its long-awaited device, which goes [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2010/03/12/can-tabula-and-tier-logic-be-successful/">Can Tabula and Tier Logic be successful?</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/07/15/rip-tier-logic/' rel='bookmark' title='Permanent Link: RIP Tier Logic'>RIP Tier Logic</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/15/why-fpga-startups-keep-failing/' rel='bookmark' title='Permanent Link: Why FPGA startups keep failing'>Why FPGA startups keep failing</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/06/03/rip-abound-logic/' rel='bookmark' title='Permanent Link: RIP Abound Logic'>RIP Abound Logic</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>The past two weeks were pretty interesting if you follow FPGAs. Yes, Xilinx and Altera kept upping their target to Wall St., but that is not where the excitement came from. It came from the recent announcements of two startups, both created in 2003 and heavily funded. <a href="http://www.tabula.com/"rel="nofollow" >Tabula</a> released its long-awaited device, which goes by the sexy name of “Spacetime”. And <a href="http://www.tierlogic.com/"rel="nofollow" >Tier Logic</a> left its stealth mode this week to announce its own device, “TierFPGA”.</p>
<p>The dominant factor in classical FPGA architecture is the interconnect: most of the die area is taken by the wires and the interconnect switches and muxes. If you can somehow reduce the area dedicated to interconnect, you can augment the logic density and lessen the cost of the device. Tabula and Tier Logic pitch a 3D architecture to address the interconnect bottleneck, albeit in very different flavors.</p>
<p><a href="http://www.ocoudert.com/blog/wp-content/uploads/2010/03/tabula_logo.jpg"><img class="alignright size-full wp-image-754" title="tabula_logo" src="http://www.ocoudert.com/blog/wp-content/uploads/2010/03/tabula_logo.jpg" alt="" width="85" height="67" /></a>Tabula innovative <a href="http://www.edn.com/blog/1690000169/post/1770052977.html"rel="nofollow" >design</a> is based on its ability to reconfigure itself, up to 8 times with a clock running at 1.6GHz. At each cycle a cell can change its functionality, its latch configuration, and its interconnect. The time-multiplexing increases the amount of logic that can be fit on the same area. It is like having 8 layers (or “folds”) of cells stacked on top of each other along a time axis, with very short connection between cells at the same (x,y) coordinate but in two adjacent folds. At each cycle one jumps to the next fold and feeds the new configured logic with the results of the previous fold. Tabula claims they increase the logic density by 2.5x compared to classical FPGA architectures.</p>
<p><a href="http://www.ocoudert.com/blog/wp-content/uploads/2010/03/tierlogiclogo.png"><img class="alignright size-full wp-image-755" title="tierlogiclogo" src="http://www.ocoudert.com/blog/wp-content/uploads/2010/03/tierlogiclogo.png" alt="" width="86" height="86" /></a>Tier Logic’s design <a href="http://www.edn.com/blog/1690000169/post/1870053187.html"rel="nofollow" >idea</a> is to place the SRAM cells that configure the interconnect muxes on top of the routing layers, instead of having them distributed throughout the logic die area. Doing so leaves more room for logic cells, increasing the cell density by about 50% according to the company. The design flow will not throw anybody off: it uses Mentor’s Precision for synthesis, and is followed by Tier Logic’s mapping and P&amp;R.</p>
<p>A big plus touted by Tier Logic is the ability of <a href="http://www.pldesignline.com/223400079"rel="nofollow" >moving</a> painlessly from their device to an ASIC. Simply replace the interconnect configuration SRAM cells at the top with metal, and voila, you obtain an ASIC with <em>no change</em> in timing. This is a simple, predictable <a href="http://www.tierlogic.com/news/8/121/Tier-Logic-announces-innovative-3D-FPGA-technology-low-cost-FPGAs-no-risk-timing-exact-ASICs/"rel="nofollow" >process</a>: it takes about 4 weeks to go from the SRAM configuration to a top-layer mask, and you do not need to go through a timing closure flow again, which means a non-recurring engineering cost of about $50k. This is a real bargain when you consider that moving from FPGA to ASIC usually requires a redesign that can take as long as 9 months.</p>
<p>So who of Tabula and Tier Logic is best positioned to challenge the duopoly Xilinx/Altera?</p>
<p>Tabula made it clear that they are aiming at the high-end of the FPGA market. There are a number of FPGA startups that targeted the same niche, and none survived. One reason is that it is easy for Xilinx and Altera to increase the size of their device, by simply moving to the next technology node. Tabula’s design is innovative and pushes the limits, but how far is too far? It is unclear whether the company can deliver the design tools to match their device’s challenges –they went through a complete reset a few years ago, replacing the whole software team. Verifying a device that can reconfigure itself 8 times in a loop may be another challenging problem. Increased density is obtained by continuous reconfiguration, which means extra power consumption: is it still an acceptable tradeoff? Last but not least, with 100+ people in the US, it is a well-known fact in the Silicon Valley that Tabula burns cash fast, and their funding of <a href="http://www.eetimes.com/showArticle.jhtml?articleID=223100910"rel="nofollow" >$106 millions</a> so far is about to come short.</p>
<p>Tier Logic’s FPGA can reduce the cost of the device for the same density. But their compelling value proposition is really their FPGA to ASIC translation. This is what Altera’s HardCopy was supposed to be, a seamless and risk-free migration from FPGA to ASIC. For anybody that wants to design an application and then migrate to a low/medium volume ASIC production, this could be the most cost efficient solution. I do not know the inside story regarding the financial aspect, but their business proposal looks more solid.</p>
<p>So who do you think has a chance here? Let’s meet again in 3-4 quarters and see how the two companies are doing.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/07/15/rip-tier-logic/' rel='bookmark' title='Permanent Link: RIP Tier Logic'>RIP Tier Logic</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/15/why-fpga-startups-keep-failing/' rel='bookmark' title='Permanent Link: Why FPGA startups keep failing'>Why FPGA startups keep failing</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/06/03/rip-abound-logic/' rel='bookmark' title='Permanent Link: RIP Abound Logic'>RIP Abound Logic</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2010/03/12/can-tabula-and-tier-logic-be-successful/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Has formal verification technology stalled?</title>
		<link>http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/</link>
		<comments>http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 07:15:45 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[EDA]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[verification]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=705</guid>
		<description><![CDATA[<p>We all know that functional verification is the <a href="http://www.elsevier.com/wps/find/bookdescription.cws_home/705233/description#description"rel="nofollow"  target="_blank">costliest</a> and most time-consuming aspect of ASIC design &#8211;about 50% of the total cost, and from 40% to 70% of the total project duration. And we all know that simulation is by far the prevalent verification method, even though it is inherently incomplete due to [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/">Has formal verification technology stalled?</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/' rel='bookmark' title='Permanent Link: The formal verification market is still untapped'>The formal verification market is still untapped</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/21/formal-verification-stalling-take-two/' rel='bookmark' title='Permanent Link: Formal verification stalling, take two'>Formal verification stalling, take two</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/05/automated-low-power-design-flow-is-up-for-grab-part-i/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part I)'>Automated low-power design flow is up for grabs (Part I)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>We all know that functional verification is the <a href="http://www.elsevier.com/wps/find/bookdescription.cws_home/705233/description#description"rel="nofollow"  target="_blank">costliest</a> and most time-consuming aspect of ASIC design &#8211;about 50% of the total cost, and from 40% to 70% of the total project duration. And we all know that simulation is by far the prevalent verification method, even though it is inherently incomplete due to an input space that is too large to be enumerated. So formal verification, which aims at <em>completeness</em>, should be a thriving field, given the impact it can have on the overall cost and schedule of ASIC designs.</p>
<p>There is certainly no lack of competition in formal verification. The big three EDA public companies, Synopsys, Cadence, and Mentor Graphics, have all their own formal verification offering (Formality, Conformal, 0-in), and there are a number of startups, e.g., <a href="http://www.jasper-da.com/"rel="nofollow" >Jasper</a>, <a href="http://www.atrenta.com/"rel="nofollow" >Atrenta</a>, <a href="http://www.realintent.com/"rel="nofollow" >Real Intent</a>, <a href="http://www.onespin-solutions.com/"rel="nofollow" >OneSpin</a>, <a href="http://www.bluepearlsoftware.com/"rel="nofollow" >Blue Pearl Software</a>, to name a few. Formal verification products cover a wide range of applications: System Verilog Assertion (<a href="http://en.wikipedia.org/wiki/SystemVerilog#Assertions"rel="nofollow" >SVA</a>) and property checking; RTL static check; equivalence checking (EC); some limited IP verification; clock-domain crossing (CDC) verification; and timing exception verification (false paths and multi-cycle paths).</p>
<p>Looking at the <a href="http://www.dac.com/47th/index.aspx"rel="nofollow" >DAC</a> submissions this year though, I am puzzled by the overwhelming number of papers focused on increasing simulation speed and coverage, as opposed to the handful of papers discussing formal techniques. And this year is not different from last year. And the year before last. Does that mean there is a lack of innovation in formal verification core techniques?</p>
<p>Improving simulation &#8211;higher coverage, less patterns, more automation— with formal techniques is a very active field, both in the academic and industrial world. Some inject faults in the RTL to separate the most discriminating patterns (e.g., <a href="http://www.springsoft.com/products/functional-qualification/certitude"rel="nofollow" >Certess</a>). Others use SAT and integer constraint solvers to reduce the number of patterns, or to automatically generate patterns for hard-to-cover code branches (e.g., <a href="http://www.nusym.com/"rel="nofollow" >NuSym</a>). But success is all relative. Certess was quickly acquired last year, while NuSym is actively looking for a buyer. There are also semi-formal tools, mixing simulation and state exploration techniques (e.g., <a href="http://www.synopsys.com/TOOLS/VERIFICATION/FUNCTIONALVERIFICATION/Pages/Magellan.aspx"rel="nofollow" >Magellan</a>), but they a have limited usage.</p>
<p>What about the more fundamental formal verification technologies? The 80’s were dominated by the development of rigorous semantics models (e.g., multi-valued logic, Verilog and VHDL operational semantics for synthesis and simulation, <a href="http://en.wikipedia.org/wiki/Temporal_logic"rel="nofollow" >temporal logics</a>, and synchronous languages like <a href="http://www-sop.inria.fr/esterel-org/files/"rel="nofollow" >Esterel</a> and <a href="http://www-users.cs.york.ac.uk/%7Eburns/papers/lustre.pdf"rel="nofollow" >Lustre</a>) and the introduction of <a href="http://en.wikipedia.org/wiki/Binary_decision_diagram"rel="nofollow" >BDDs</a>. The 90’s saw EC tools spreading in the industry and the rise of model checking. The 00’s were all about <a href="http://en.wikipedia.org/wiki/Boolean_satisfiability_problem#Algorithms_for_solving_SAT"rel="nofollow" >SAT</a> and model abstraction to push the capacity of EC and bring property checking to the end-user, as well as static code analysis, CDC, and timing verification. What are we going to see in this decade?</p>
<p>Verification has a lot of challenging problems, with incomplete or no solution at all. Here is my list:</p>
<ul>
<li>Merged      arithmetic. There are robust methods to verify adders and multipliers of practically      any size, but no one can verify merged arithmetics as small as 32-bits.</li>
<li>Low      power. This leads to complex properties capturing the correctness of      sequential clock gating and power gating. The former is becoming more      common, and there are techniques to address most of it (e.g., Calypto and      Conformal). But the later is still waiting for a comprehensive and      automated solution.</li>
<li>RTL      debugging. There are a number of static code checkers, but debugging is      still very poor.</li>
<li>HW/SW      verification. Can we leverage deductive methods (predicate logic, HOL,      rewriting system) to close the gap between software and RTL?</li>
<li>Mixed      signal (analog/digital) devices: this is a very young area of research,      but it should see a lot of focus given the increasing ubiquity of mixed      signal designs.</li>
</ul>
<p>If formal verification core technology is to evolve, we will see some original solutions to the problems listed above. What do you think should be added to this list? And which techniques will evolve as the most promising?</p>
<hr />
<strong>UPDATE</strong>: I had enough interesting comments and feedback about this post to motivate a <a href="http://www.ocoudert.com/blog/2010/02/21/formal-verification-stalling-take-two/" target="_self">follow-up post</a>.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/' rel='bookmark' title='Permanent Link: The formal verification market is still untapped'>The formal verification market is still untapped</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/21/formal-verification-stalling-take-two/' rel='bookmark' title='Permanent Link: Formal verification stalling, take two'>Formal verification stalling, take two</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/05/automated-low-power-design-flow-is-up-for-grab-part-i/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part I)'>Automated low-power design flow is up for grabs (Part I)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>The truth about Twitter usage</title>
		<link>http://www.ocoudert.com/blog/2009/12/02/the-truth-about-twitter-usage/</link>
		<comments>http://www.ocoudert.com/blog/2009/12/02/the-truth-about-twitter-usage/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 23:46:11 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[advertising]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[social network]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=529</guid>
		<description><![CDATA[<p>Three research firms reported traffic to Twitter.com <a href="http://www.emarketer.com/Article.aspx?R=1007388" rel="nofollow"  target="_blank">dropping </a>between the month of September and October. According to these firms, the number of unique US visitors to the Twitter website went down [...]</p>
<p>Continue reading <a href="http://www.neowin.net/news/main/09/12/02/the-truth-about-twitter-usage" rel="nofollow"  target="_blank">The truth about Twitter usage</a></p>


<p>Related posts:<a href='http://www.ocoudert.com/blog/2010/01/12/is-twitter-flattening-a-short-answer/' rel='bookmark' title='Permanent Link: Is Twitter Flattening? A Short [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/12/02/the-truth-about-twitter-usage/">The truth about Twitter usage</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/01/12/is-twitter-flattening-a-short-answer/' rel='bookmark' title='Permanent Link: Is Twitter Flattening? A Short Answer'>Is Twitter Flattening? A Short Answer</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/11/24/twitter-sure-is-a-rollercoaster-but-going-up-or-down/' rel='bookmark' title='Permanent Link: Twitter sure is a rollercoaster, but going up or down?'>Twitter sure is a rollercoaster, but going up or down?</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/23/so-will-buzz-and-facebook-finally-bury-twitter/' rel='bookmark' title='Permanent Link: So will Buzz and Facebook finally bury Twitter?'>So will Buzz and Facebook finally bury Twitter?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Three research firms reported traffic to Twitter.com <a href="http://www.emarketer.com/Article.aspx?R=1007388" rel="nofollow"  target="_blank">dropping </a>between the month of September and October. According to these firms, the number of unique US visitors to the Twitter website went down [...]</p>
<p>Continue reading <a href="http://www.neowin.net/news/main/09/12/02/the-truth-about-twitter-usage" rel="nofollow"  target="_blank">The truth about Twitter usage</a></p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/01/12/is-twitter-flattening-a-short-answer/' rel='bookmark' title='Permanent Link: Is Twitter Flattening? A Short Answer'>Is Twitter Flattening? A Short Answer</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/11/24/twitter-sure-is-a-rollercoaster-but-going-up-or-down/' rel='bookmark' title='Permanent Link: Twitter sure is a rollercoaster, but going up or down?'>Twitter sure is a rollercoaster, but going up or down?</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/23/so-will-buzz-and-facebook-finally-bury-twitter/' rel='bookmark' title='Permanent Link: So will Buzz and Facebook finally bury Twitter?'>So will Buzz and Facebook finally bury Twitter?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/12/02/the-truth-about-twitter-usage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What was hot at the TechCrunch Munich event?</title>
		<link>http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/</link>
		<comments>http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 19:12:44 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[show]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=427</guid>
		<description><![CDATA[<p>I was today in Sun Microsystems offices, which co-hosted the TechCrunch Munich event. Mike Butcher, editor TechCrunch Europe, was here to take about 150 attendants through a few presentations and 12 startup pitches. I <a href="../2009/10/18/what-to-see-at-the-techcrunch-munich-event/" rel="nofollow" >promised</a> I would write about what I liked, so here it goes.</p>
<p>The breakroom had a tweeter wall with live [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/">What was hot at the TechCrunch Munich event?</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/' rel='bookmark' title='Permanent Link: What to see at the TechCrunch Munich event?'>What to see at the TechCrunch Munich event?</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/15/why-fpga-startups-keep-failing/' rel='bookmark' title='Permanent Link: Why FPGA startups keep failing'>Why FPGA startups keep failing</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I was today in Sun Microsystems offices, which co-hosted the TechCrunch Munich event. Mike Butcher, editor TechCrunch Europe, was here to take about 150 attendants through a few presentations and 12 startup pitches. I <a href="../2009/10/18/what-to-see-at-the-techcrunch-munich-event/" rel="nofollow" >promised</a> I would write about what I liked, so here it goes.</p>
<p>The breakroom had a tweeter wall with live reaction of the attendance &#8211;hashtag #tcm09, <a href="http://search.twitter.com/search?q=%23tcm09" rel="nofollow" >check it out</a>.</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IMG00014.jpg"><img class="size-full wp-image-434 aligncenter" title="IMG00014" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IMG00014.jpg" alt="IMG00014" width="250" /></a></p>
<p>The first to present was Mathias Roth from iOpus.com. His message was quite simple: if you are a startup that wants to get attention, be the first to develop for a new platform, <em>any</em> new platform. The rational: if you are among the first, chance is that you will stick. Look at the top 50 add-ons to Firefox today: half of them have been introduced within the year Firefox made its add-ons development platform available. Mathias’ recommendation: get on Chrome’s bandwagon and develop your add-on now –there are only about 25 Chrome add-ons today. Even though Chrome’s add-ons website will not come before the end of the year, it will pay to be among <a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IMG00011.jpg"><img class="alignright size-full wp-image-436" title="IMG00011" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IMG00011.jpg" alt="IMG00011" width="250" /></a>the first.</p>
<p>Next speaker was Rainer Maerkle from Holtzbrinck Ventures. He gave a <em>great</em> talk about what it takes to launch a startup. I will not do justice by trying to reduce his talk to a few words, but it would come as something like: do your homework, focus, take risks, focus, execute, focus. Oh, and don’t wait for VC money, or don’t over-specify your product: just do it and get it out, then release often.</p>
<p>Then come the exciting part: 12 startups pitching for 3mn each + 1mn for question. Some did great, some did not do as well, but all show the enthusiasm of the entrepreneur. <em>Disclaimer</em>: I am sharing what I thought of the presentations and of the startups ideas and business models; this is a very subjective digest, go visit these sites and make up your own mind.</p>
<ol>
<li><a href="http://goutez.net/" rel="nofollow" >Goutez (food for friends)</a>. They provide an      on-line market place to buy local food products. Lots of people tried to      be on-line food resellers, but only a fraction is still alive. I don’t      know whether there is a market large enough to have a sustainable business      here.</li>
<li><a href="http://www.communote.com/" rel="nofollow" >Communote</a>. They propose an enterprise      microblogging platform. Basically, a secured place where people can      collaborate and share info. It looks pretty slick, and it has already a      few customers. But having a Twitter for enterprise might not be enough.      They had quite a number of questions regarding their differentiation with      respect to other enterprise collaborative platforms. Also, may I ask what      if GoogleWave goes enterprise?</li>
<li><a href="http://www.graph.me/" rel="nofollow" >Graph.me</a>. Good presentation on a platform      that enables users to build up their own poll, which they ask friends or      social network members to answer (Facebook, MySpace). Business model is to      sell the resulting data pool to marketing research. Neat idea. Obvious      question is the privacy problem.</li>
<li><a href="http://www.captchaad.com/" rel="nofollow" >CaptchaAd</a>. Propose a video ad      CAPTCHA. Instead of your usual textual CAPTCHA, a short ad video is played      and the used must answer a simple question (e.g., what was the brand of      the car in the video?) to prove she is not a spambot. Clever idea, but      will the users enjoy watching 10 seconds of video ad to fill in a form?</li>
<li><a href="http://www.rdpnda.com/" rel="nofollow" >Red Panda</a>. Intentional browsing add-on      for Firefox: it instantaneously shows on a side-bar links (news, product      reviews, Wikipedia articles, tweets, etc) that are relevant to whatever      web page you are currently displaying. Very cool. Business model is      targeted ad.</li>
<li><a href="http://www.intelliad.de/" rel="nofollow" >intelliAd</a>. They have a web platform to      optimize SEM campaign, e.g., determine the best bid for a keyword to      optimize CPI. Easy setup, nice GUI, these guys are flying with 20      customers and are looking in expanding in the US. Very solid product and      business plan, a success in the making.</li>
<li><a href="http://vicommerce.com/" rel="nofollow" >Vicommerce.com</a>. They provide a layer on      top of video players that is used to define clickable area by the on-line      resellers. This results in a very entertaining on-line shopping      experience. They already have some major customers, solid business plan.</li>
<li><a href="http://www.getyourguide.com/" rel="nofollow" >Getyourguide.com</a>. A platform to      get travelers and local activity providers      together. Nice but is that enough differentiation with Yahoo! travel      and Tripadvisor, to name only two?</li>
<li><a href="http://www.directededge.com/" rel="nofollow" >Directededge.com</a>. They provide a      user recommendation plug-in to businesses. Based on the fact that 20% of      Amazon’s revenue comes from user recommendation click-throughs, this is      definitely a good idea. The product is still in an early stage, stay      tuned.</li>
<li><a href="http://www.snipclip.com/" rel="nofollow" >SnipClip.com</a>. They aim at monetizing      brands on social networks (Facebook, MySpace), which are known to have a      very low clock-through rate. The idea is to sell branded virtual goods      (mostly media). Creative, let’s see whether the social network community will      bite.</li>
<li><a href="http://www.terminii.de/" rel="nofollow" >Terminii</a>. Propose a web-based      appointment services for small and mid-size business. Definitely useful.      Disastrous presentation: the presenter stopped his talk because of slides      issue. Mike Butcher, the host of the event, did a great job to bring back      the speaker and let him explain his business.</li>
<li><a href="http://www.valuescope.de/" rel="nofollow" >Valuescope</a>. A news aggregator      filtered with natural language analysis, targeted at sales and marketing. Extremely      good presentation, very focused.</li>
</ol>
<p>Mike Butcher’s top 5 picks were:</p>
<ul>
<li>#5: <a href="http://vicommerce.com/" rel="nofollow" >Vicommerce.com</a></li>
<li>#4: <a href="http://www.directededge.com/" rel="nofollow" >Directededge.com</a></li>
<li>#3: <a href="http://www.valuescope.de/" rel="nofollow" >Valuescope</a></li>
<li>#2: <a href="http://www.captchaad.com/" rel="nofollow" >CaptchaAd</a></li>
</ul>
<p>and his top one pick was (drum roll please):</p>
<ul>
<li>#1: <a href="http://www.graph.me/" rel="nofollow" >Graph.me</a></li>
</ul>
<p>Overall a very interesting day, very well organized, with a great host. It showed that Munich has talents and a good VC structure to produce a dynamic startup environment. Congratulations to the speakers and to those that came to pitch their startups!</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/' rel='bookmark' title='Permanent Link: What to see at the TechCrunch Munich event?'>What to see at the TechCrunch Munich event?</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/15/why-fpga-startups-keep-failing/' rel='bookmark' title='Permanent Link: Why FPGA startups keep failing'>Why FPGA startups keep failing</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The formal verification market is still untapped</title>
		<link>http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/</link>
		<comments>http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:19:31 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[ASIC]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[verification]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=418</guid>
		<description><![CDATA[<p><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/873609_33942684.jpg"></a>Functional verification is a major bottleneck in the chip design cycle. Any misstep in closing the functional correctness of a digital system costs millions of dollars in redesign, additional testing, and silicon respins. One can argue at length about its <a href="http://www.elsevier.com/wps/find/bookdescription.cws_home/705233/description#description" rel="nofollow" >actual cost</a>, but people in the industry usually agree that functional verification [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/">The formal verification market is still untapped</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/' rel='bookmark' title='Permanent Link: Has formal verification technology stalled?'>Has formal verification technology stalled?</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/21/formal-verification-stalling-take-two/' rel='bookmark' title='Permanent Link: Formal verification stalling, take two'>Formal verification stalling, take two</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/06/automated-low-power-design-flow-is-up-for-grabs-part-ii/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part II)'>Automated low-power design flow is up for grabs (Part II)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/873609_33942684.jpg"><img class="alignright size-full wp-image-421" title="873609_33942684" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/873609_33942684.jpg" alt="873609_33942684" width="140" /></a>Functional verification is a major bottleneck in the chip design cycle. Any misstep in closing the functional correctness of a digital system costs millions of dollars in redesign, additional testing, and silicon respins. One can argue at length about its <a href="http://www.elsevier.com/wps/find/bookdescription.cws_home/705233/description#description" rel="nofollow" >actual cost</a>, but people in the industry usually agree that functional verification takes between 40 and 70% of a project&#8217;s labor, and about 50% of the total cost. The recent <a href="http://www.eetimes.com/news/design/showArticle.jhtml?articleID=220900541" rel="nofollow"  target="_self">announcement </a>of Synopsys and Freescale to <span>broaden their collaboration to cut IC verification says it all: </span>the two partners intend to manage<span> &#8220;the ever-increasing cost of verification, which can encompass up to 75 percent of the total cost of product development&#8221;.</span></p>
<p>Getting actual figures about the size of the functional verification market proves to be elusive because of the way the products are tied to synthesis license deals, and because of the lack of independent analysts in EDA. Still, the simulation and emulation market of digital systems can be estimated to be at least five times larger than today’s formal verification market. But simulation can only take you so far, so one wonders why formal verification does not have a larger share. Is it because the technology is limited, or because the market is not ready?</p>
<p><strong>Equivalence checking</strong></p>
<p>Equivalence checking (EC) consists of verifying that a netlist implements the behavior specified by a RTL description, or that two netlists are equivalent. Historically, EC is the first industrial formal verification tool brought to the ASIC world. Cadence’s <a href="http://www.cadence.com/products/ld/equivalence_checker/pages/default.aspx" rel="nofollow" >Conformal</a> is still the reference (about 60% of the market), with Synopsys’ <a href="http://www.synopsys.com/tools/verification/formalequivalence/pages/formality.aspx" rel="nofollow" >Formality</a> coming second.</p>
<p>EC’s technology is very mature, but this does not mean no further progress is necessary. Flip-flop matching, the primarily step that consists of determining the pairs of flip-flops that need to be compared, is expected to be done quickly and automatically, with no manual guidance. Datapath verification remains a major challenge, and proving the correctness of merged arithmetic automatically is still an open problem. Last but not least, debugging is a very complicated task. Incremental verification and rectification techniques can be quite useful to help pinpointing the functional issue.</p>
<p><strong>Model checking and property verification</strong></p>
<p>Model checking and property verification are still a fraction of the formal verification market, with many players on the field. There are two obstacles for a larger usage of the approach. The first one is that it can be complicated to write a FSM or property that captures a particular behavior. SVA (System Verilog Assertions), OVL (Open Verification Library), and PSL (Property Specification Language) help in that regard, but they need to be more systematically used in the design community. The second obstacle is that model checking techniques can only solve relatively small problem instances. This is why some go with hybrid verification techniques (read: may be incomplete), like <a href="http://www.synopsys.com/TOOLS/VERIFICATION/FUNCTIONALVERIFICATION/Pages/Magellan.aspx" rel="nofollow" >Magellan</a> or <a href="http://www.mentor.com/products/fv/0-in_fv/" rel="nofollow" >0-in</a>, while other stick with complete formal methods, like <a href="http://www.jasper-da.com/" rel="nofollow" >Jasper</a> and <a href="http://www.onespin-solutions.com/" rel="nofollow" >OneSpin</a>.</p>
<p>Because writing properties can be so complicated, specialized branches grew to address specific needs, as shown below.</p>
<ul>
<li><strong>IP verification</strong>. With SoCs using      IPs from many different sources, verifying the compliance of these IPs with      respect to standard interfaces (e.g., PCI or USB) in the context of the      application is crucial.  Conformal,      with its verification IP portfolio, is in a good position to address the      problem. Also OneSpin is known to have interesting technology in that      space, even though they are not pushing it at the moment.</li>
<li><strong>Timing verification</strong>. Incorrect      timing constraints can lead to missing a target clock cycle, or worse, to a      chip failure. Verifying timing exceptions (false paths and multi-cycle      paths), as well as CDC (Clock-Domain Crossing), has become a center of      attention. It is still unclear how big the market is. However several      discussions with IC design companies led me to believe that verifying a      set of timing exceptions (usually in the order of 10,000 SDC constraints) save      one month work of an engineer. Automation and speed are keys here. <a href="http://www.atrenta.com/" rel="nofollow" >Atrenta</a>, <a href="http://www.realintent.com/" rel="nofollow" >Real Intent</a>, and <a href="http://www.mentor.com/products/fv/0-in-cdc/" rel="nofollow" >0-in</a> propose      interesting solutions in that space.</li>
<li><strong>Power verification</strong>. When doing <a href="../2009/10/05/automated-low-power-design-flow-is-up-for-grab-part-i/#power_gating" rel="nofollow" >power      gating</a>, one needs to verify that the application is powered back up <a href="../2009/10/06/automated-low-power-design-flow-is-up-for-grabs-part-ii/#power_gating_verification" rel="nofollow" >properly</a>.      Integration with UPF or CPF provides the required automation. Conformal and      CPF have an edge in that field.</li>
<li><strong>Sequential clock gating verification</strong>.      Traditional (combinatorial) clock gating is well supported by EC tools.      Sequential clock gating exploits sequential dependencies to derive      additional gating conditions, which can be used to save more dynamic      power. It has been made popular by <a href="http://www.calypto.com/" rel="nofollow" >Calypto</a> &#8211;<a href="http://www.envis.com/" rel="nofollow" >Envis</a> is also proposing a similar      technique at the netlist level. Sequential clock gating correctness cannot      be expressed easily with SVA or OVL without making the verification task      extremely complex, which explained why specialized verification techniques      have been developed.</li>
</ul>
<p><strong>Where formal verification will grow</strong></p>
<p>Formal verification is no longer limited to ASICs: complex systems –SoC, FPGA, and HW/SW co-design— will benefit dramatically from better formal verification techniques if they are deployed adequately.</p>
<p>With the ever-growing size of FPGAs (Altera’s <a href="http://www.altera.com/products/devices/stratix-fpgas/stratix-iv/stxiv-index.jsp" rel="nofollow" >Stratix IV</a> packs 820k logic elements, and Xilinx’ <a href="http://www.xilinx.com/products/virtex6/lxt.htm" rel="nofollow" >Virtex-6</a> has up to 750k logic cells), it is clear that simulation will no longer be sufficient to validate the correctness of programmable logic devices. The need for FPGA EC is real, and this requires complete automation and full support for <a href="http://en.wikipedia.org/wiki/Retiming" rel="nofollow" >retiming</a> –OneSpin’s <a href="http://www.onespin-solutions.com/360ec-fpga.php" rel="nofollow" >360 EC FPGA</a> has shown some competitive solution in that space. Also note that IP verification and timing verification apply to the FPGA designs too. The real question is whether FPGA designers are willing to pay for formal verification tools.</p>
<p>IP verification, and verifying the correctness of a SoC using IPs, is certainly a very strong driver for more sophisticated formal verification solutions. Power verification will become part of the ASIC design flow, as EC is part of the synthesis flow. Timing verification is still looking for its footing in the design flow –one question is the debug environment, which is still relatively limited, e.g., to showing waveforms.</p>
<p>Looking forward, formal verification techniques can be used (and have been used) in other fields than circuit design. Any critical digital system can benefit from formal verification techniques –transportation, medical equipments, security and privacy applications. The automotive industry is one of the most obvious targets. Cars are ubiquitous, they contains more and more electronics (representing about 30% of the end price today), and a functional bug can have very costly <a href="http://www.latimes.com/business/la-fi-toyota-recall18-2009oct18,0,739395.story" rel="nofollow" >consequences</a>. Cars rely on digital systems for anything from optimizing their engine’s efficiency to navigation systems, entertainment, and on-board diagnosis. Soon the intra-vehicle, vehicle-to-vehicle, and vehicle-to-roadside networking will fuel innovative products, driving the needs for fast development and the highest possible level of correctness. The EDA industry is taking notice, and Mentor has certainly taken the <a href="http://www.mentor.com/products/vnd/" rel="nofollow" >lead</a> there. Whether they provide the adequate functional verification framework is another matter.</p>
<p>Formal verification will extend its reach by addressing the hard problems of EC (datapath verification, and retiming for FPGA), by being seamlessly integrated in the synthesis flow (power and timing exception verification), and by providing practical solutions to IP and hybrid HW/SW design verification.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2010/01/24/has-formal-verification-technology-stalled/' rel='bookmark' title='Permanent Link: Has formal verification technology stalled?'>Has formal verification technology stalled?</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/02/21/formal-verification-stalling-take-two/' rel='bookmark' title='Permanent Link: Formal verification stalling, take two'>Formal verification stalling, take two</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/06/automated-low-power-design-flow-is-up-for-grabs-part-ii/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part II)'>Automated low-power design flow is up for grabs (Part II)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What to see at the TechCrunch Munich event?</title>
		<link>http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/</link>
		<comments>http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 15:38:20 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[show]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=407</guid>
		<description><![CDATA[<p><a href="http://farm4.static.flickr.com/3566/3326125711_9234e74417.jpg" rel="nofollow" ></a>After the giant <a href="http://www.techcrunch50.com/" rel="nofollow" >TechCrunch 50</a> last September in San Francisco, TechCrunch continues to host smaller events in several cities. Next in line is <a href="http://www.amiando.com/tcmunich.html" rel="nofollow" >TechCrunch Munich</a>, which will be held on Tuesday Oct. 20th at the Sun Microsystems offices in Munich.</p>
<p>The gathering is an opportunity for local entrepreneurs [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/">What to see at the TechCrunch Munich event?</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/' rel='bookmark' title='Permanent Link: What was hot at the TechCrunch Munich event?'>What was hot at the TechCrunch Munich event?</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/11/01/what-is-twitter%e2%80%99s-next-step/' rel='bookmark' title='Permanent Link: What is Twitter’s next step?'>What is Twitter’s next step?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://farm4.static.flickr.com/3566/3326125711_9234e74417.jpg" rel="nofollow" ><img style="float: right;" src="http://farm4.static.flickr.com/3566/3326125711_9234e74417.jpg" alt="Olympiad Park" width="210" /></a>After the giant <a href="http://www.techcrunch50.com/" rel="nofollow" >TechCrunch 50</a> last September in San Francisco, TechCrunch continues to host smaller events in several cities. Next in line is <a href="http://www.amiando.com/tcmunich.html" rel="nofollow" >TechCrunch Munich</a>, which will be held on Tuesday Oct. 20<sup>th</sup> at the Sun Microsystems offices in Munich.</p>
<p>The gathering is an opportunity for local entrepreneurs and techies to network, as well as a few selected startups to pitch in front of their peers. Present also will be a few VC firms. The <a href="http://uk.techcrunch.com/2009/10/09/techcrunch-munich-20-october/" rel="nofollow" >highlights</a>:</p>
<ul>
<li>14.30 Welcome:      Mike Butcher (Editor TechCrunch Europe)</li>
<li>14.40 Mathias      Roth (iOpus.com) “<em>Chrome: Why      creating products for a brand new platform can supercharge their service</em>”</li>
<li>15.00 Rainer      Maerkle (Holtzbrinck Ventures) “<em>Copy,      adapt or innovate – which type of business should you start?</em>”</li>
<li>15.20      Startup Pitches</li>
<li>17.00      Panel of Startup Support Schemes in Bavaria      interrogated by Mike Butcher</li>
<li>17.20 Matthias      Kroener (CEO, Fidor Bank, Munich)      “<em>With traditional banking dying, and      community banking up, what does this mean for the startup economy</em>”</li>
<li>17.45      Finger food, drinks, and more networking</li>
</ul>
<p>One of the exciting parts in that kind of event is of course the startups pitches. There will be 11 startups going for the seduction exercise, speed-dating style: 3mn presentation + 1mn for question! It is tough to convey the message with that time constraint, but only the best shall survive. The chosen ones are:</p>
<ol>
<li><a href="http://www.communote.com/" rel="nofollow" >Communote</a> –enterprise microblogging      platform</li>
<li><a href="http://www.graph.me/" rel="nofollow" >Graph.me</a> –rate your social network reach</li>
<li><a href="http://www.captchaad.com/" rel="nofollow" >CaptchaAd</a> –CAPTCHA with video and ads</li>
<li><a href="http://www.rdpnda.com/" rel="nofollow" >Red Panda</a> –intentional browsing</li>
<li><a href="http://www.intelliad.de/" rel="nofollow" >intelliAd</a> –bid management for Internet      marketing</li>
<li><a href="http://vicommerce.com/" rel="nofollow" >Vicommerce.com</a> –in-video shopping</li>
<li><a href="http://www.getyourguide.com/" rel="nofollow" >Getyourguide.com</a> –on-line booking      for tours, attractions and activities</li>
<li><a href="http://www.directededge.com/" rel="nofollow" >Directededge.com</a> –users      recommendation plug-in</li>
<li><a href="http://www.snipclip.com/" rel="nofollow" >SnipClip.com</a> –virtual goods selling platform for social networks</li>
<li><a href="http://www.terminii.de/" rel="nofollow" >Terminii</a> –web-based appointment services      for small and mid-size companies</li>
<li><a href="http://www.valuescope.de/" rel="nofollow" >Valuescope</a> –info aggregation and      analysis for marketing and sales decisions</li>
</ol>
<p>I will share what I saw and what I liked after the event –that is, if I can get in! The on-line registration closed unexpectedly, I hope that showing at the door will demonstrate enough motivation for me to attend. Stay tuned.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/20/what-was-hot-at-the-techcrunch-munich-event/' rel='bookmark' title='Permanent Link: What was hot at the TechCrunch Munich event?'>What was hot at the TechCrunch Munich event?</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/11/01/what-is-twitter%e2%80%99s-next-step/' rel='bookmark' title='Permanent Link: What is Twitter’s next step?'>What is Twitter’s next step?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/10/18/what-to-see-at-the-techcrunch-munich-event/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Test-driven design, a methodology for low-defect software</title>
		<link>http://www.ocoudert.com/blog/2009/10/13/test-driven-design/</link>
		<comments>http://www.ocoudert.com/blog/2009/10/13/test-driven-design/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 12:29:52 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[EDA]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[verification]]></category>

		<guid isPermaLink="false">http://www.ocoudert.com/blog/?p=294</guid>
		<description><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a>
I wrote <a href="http://www.ocoudert.com/blog/2009/10/08/api-design-101/" target="_blank">earlier</a> about the good practices in designing APIs, which is so important when developing complex software. However one usually does not have the chance to start a product from scratch. This means that more often than ever, a software manager picks up an existing tool with [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/10/13/test-driven-design/">Test-driven design, a methodology for low-defect software</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/08/api-design-101/' rel='bookmark' title='Permanent Link: API design 101'>API design 101</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/' rel='bookmark' title='Permanent Link: Software outsourcing, a necessary evil'>Software outsourcing, a necessary evil</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/' rel='bookmark' title='Permanent Link: The formal verification market is still untapped'>The formal verification market is still untapped</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a><br />
I wrote <a href="http://www.ocoudert.com/blog/2009/10/08/api-design-101/" target="_blank">earlier</a> about the good practices in designing APIs, which is so important when developing complex software. However one usually does not have the chance to start a product from scratch. This means that more often than ever, a software manager picks up an existing tool with an existing team. Making the tool more efficient –better QoR, faster runtime, smaller memory footprints, more stability, new features, etc— is made difficult by legacy code, awkward APIs, or plain wrong architecture. What to do then? We usually cannot afford to rewrite all or major parts of the product. Does that mean that we are stuck with an endless cycle of resource-intensive software incremental changes, often creating as many bugs that they are intended to fix?</p>
<p><strong>Defect rate</strong></p>
<p>First I would like to discuss the notion of software reliability and how it evolved over the past 40+ years. A defect causes an invalid behavior of a program with respect to its specification (e.g., incorrect output, performance issue, crash). One of many ways to look at software quality is to estimate its defect rate, i.e., the number of defects per line of code (loc), or more conveniently per 1,000 lines of code (kloc).</p>
<p>The first observation is that the larger the code, the higher its defect rate. It is estimated that the bug rate increases logarithmically with code size.</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IBM_defect_study.png"><img class="aligncenter" title="IBM defect study" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/IBM_defect_study.png" alt="IBM defect study" align="middle" /></a><br />
Source: <em>Program Quality and Programmer Productivity, Capers Jones, IBM 1977</em></p>
<p>Thus the total number of defects for a specific application can be reduced by the following:</p>
<ol>
<li>Continuous      code factorization (direct loc reduction).</li>
<li>Use of      libraries (which have a reduced bug rate, thanks to the extensive exposure      they receive due to their long lifespan and high usage).</li>
<li>Increase      the expressive power of the programming language (indirect loc reduction).</li>
</ol>
<p>Since the introduction of FORTRAN in 1957, many languages and operating systems have been created and have grown more powerful and sophisticated. What could be typically coded in 10 klocs of FORTRAN can be coded today with less than 5 klocs of C++, and about 3-4 klocs of Java. Raising the level of abstraction of programming languages helps decreasing the total number of defects because it results in smaller programs with a lower defect rate.</p>
<p>Evidently, testing reduces the defect rate. A software powerhouse like Microsoft reports about 10-20 defects/klocs before QA, and claims that the rate drops to 1/kloc in released code. Looking at long lifespan and very critical code, statistic from the Jet Propulsion Laboratory shows that spacecraft software (which is typically only 20 klocs, and must run without interruption for years) reaches 6-10 defects/klocs after 2-5 years of testing. The code developed for the shuttle program is estimated to have less than 0.1 defect/klocs.</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/JPL_defect_data.png"><img class="aligncenter" title="JPL_defect_data" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/JPL_defect_data.png" alt="JPL defect data" /></a><br />
Source: <em>Nikora, Allen P., “Error Discovery Rate by Severity Category and Time to Repair Software Failures for Three JPL Flight Projects”, Software Product Assurance Section, Jet Propulsion Laboratory, November 5, 1991&#8243; </em></p>
<p>Over the past 40 years, independent researches from academia and the private sector have shown that on average an application has a defect rate of 5.5/klocs, regardless of the programming language and the operating system used for development. This looks counterintuitive, since increasing the abstraction level of the programming language reduces the bug rate and the actual size of one specific application. But that progress is neutralized by the ever-increasing size and complexity of the programs, made possible by better software development methodologies and powerful development environments. To put a defect rate of 5.5/kloc in perspective, consider your typical EDA place-and-route product, say 3Mlocs of C/C++, with a likely high turnover rate (i.e., percentage of locs that are modified in every release). You can expect in the order of 16,000 defects…</p>
<p><strong>Test-Driven Design</strong></p>
<p>Now I will present a method that I successfully used for both existing and from-scratch products. It is based on the observation that independently from the quality of the team and the advancement of the tool, the software complexity and the unpredictable evolution of the product makes managing the software quality quite problematic. Think EDA, where customers ask for new capabilities every week and salespeople sell features 6 or 12 months before they are actually developed. It is difficult, if not impossible, to have an upfront, clean, and frozen specification, from which an architecture and a set of APIs can be derived. One needs to change the architecture and the APIs because of new unpredicted features and unforeseen problems, or simply because the software is written in a hurry without the adequate resources &#8211;I have no doubt that most readers will agree on that last point. This creates bloated code with a high defect rate, which result in application with a larger number of bugs.</p>
<p>Test-driven design flips the traditional software development scheme upside-down. In most cases, the software development flow consist of (1) specify the requirements in some language (e.g., English, ML, C++ or Java header files), and (2) iterate a code/test loop until the software reaches a point where it is deemed stable enough to go through a full QA regression release process. This often leads to slow iterations between the release team and the R&amp;D team before the release is fully qualified. Also the essence of the original specification may be lost because there is no concrete way (read: operational semantics) to check whether the released product actually meets its intended requirements.</p>
<p><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/classic_vs_tdd_software_development_flow.png"><img class="aligncenter size-full wp-image-309" title="classic_vs_tdd_software_development_flow" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/classic_vs_tdd_software_development_flow.png" alt="classic_vs_tdd_software_development_flow" width="600" /></a></p>
<p style="text-align: center;"><em>Traditional vs. test-driven software development flow</em></p>
<p>Contrast this with a test-driven design approach. In that methodology, the tests are written <em>before</em> anything else. The goal is to capture the specification with a set of small (positive <em>and</em> negative) unit tests. Then some code is written and run on the unit tests. Some of the tests fail, which lead to further refinement of both the unit tests and the code. This iteration write-test/code/test converges until one cannot design a new test that would break the code. The next step, QA regression release process, can then be carried on.</p>
<p>A few things are important to recognize in a test-driven software development methodology: (1) the spec <em>is</em> the set of unit tests; (2) therefore the release can be validated as meeting the spec; (3) the testing iteration handled by R&amp;D is closed when the unit tests <em>and</em> the code are fully stable, which leads to fewer iterations between the release and R&amp;D teams; and (4) this methodology does not assume anything about the intrinsic quality of the code and the strength of the development team. Indeed this approach can be used on very badly architected code and still lead to substantial improvements.  Also note that the unit tests can be internal, e.g., written in C++ and providing a self-testing mechanism, or more traditional with external data that are fed to the application.</p>
<p><strong>Case studies</strong></p>
<p>Let me give a few concrete examples. A tool I was in charge of contained some legacy code that performed an essential task in EDA: constant propagation (it consists of propagating logic values through a logic network, following basic computation rules, e.g., NOT(0) = 1, AND(0, 1) = 0, and AND(1, 1) = 1). The computational principles are simple, but a good constant propagation system should be lazy, incremental, support undo, may explain to the user why some constant occurs in some part of the network, etc.  This makes the development of the system much more challenging.</p>
<p>The legacy code produced crashes now and then. It was difficult to read, it contained suspicious piece of code to handle corner cases (e.g., multi-driver nets, user-set constants), and it had a poor testing coverage (&lt;50%). I decided to go for a full rewrite with a clean API, and unit tests were developed together with the new code following a TDD methodology. This resulted in 6267 loc of C++, 40% of which being unit tests (click the screenshot of the C++ unit tests below), made of 1415 asserts. That code was release in May 2007, got 3 reported defects until November 2007, and has been without defect since then.</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/screenshot_constant_annot_unit_test.png"><img class="size-full wp-image-298  aligncenter" title="screenshot_constant_annot_unit_test" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/screenshot_constant_annot_unit_test.png" alt="screenshot_constant_annot_unit_test" width="300" /></a></p>
<p>Another example is a C++ template’ized bitwise four-valued simulator, written to match the Verilog semantics. This was done with 8014 loc of C++, including 40% of unit tests, made of 1015 asserts (click the screenshot below: you can recognize the basic four-valued logic truth tables).  The template was self-tested with three different concrete instances of logic representation (on 2-tuples of bool, on strings made of 32 or 64 characters &#8217;0&#8242;, &#8217;1&#8242;, &#8216;x&#8217;, and &#8216;z&#8217;, and finally on an actual logic netlist).  No defect was ever found on the semantics.</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/screenshot_simulator_unit_test.png"><img class="size-full wp-image-299  aligncenter" title="screenshot_simulator_unit_test" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/screenshot_simulator_unit_test.png" alt="screenshot_simulator_unit_test" width="300" /></a></p>
<p>In both these cases, I had the opportunity of rewriting or starting from scratch. What if one has to improve on an existing system too large to be rewritten?</p>
<p>The third example is about a complex feature (sequential clock gating) that at the time had been released 6 months before. The field complained about inconsistencies and erratic behavior, so I decided to apply a TDD methodology to rectify the code. First hurdle, we established a unit test campaign, which consists of describing the spec in terms of unit tests in plain English and sketches. This produced 49 unit tests, as shown below (click to enlarge).</p>
<p style="text-align: center;"><a href="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/seq_clock_gating_unit_test_campaign.png"><img class="aligncenter size-full wp-image-300" title="seq_clock_gating_unit_test_campaign" src="http://www.ocoudert.com/blog/wp-content/uploads/2009/10/seq_clock_gating_unit_test_campaign.png" alt="seq_clock_gating_unit_test_campaign" width="300" /></a></p>
<p>Second hurdle, we proceeded to translate these informal unit test descriptions into elementary RTL descriptions. The idea was that if the code was compliant to the spec, we could predict exactly which optimized netlist it would produce. Third hurdle, a 3<sup>rd</sup> party reviewed these 49 RTL tests, and found that 9 of them were faulty because they did not capture what was specified in the document. Once we fixed these tests came the fourth hurdle: we run the code.</p>
<p>The results were brutal: the code crashed on 3 tests, it synthesized a functionally incorrect netlist in 5 cases, and produced 13 suboptimal results. Overall, 21 failures out of 49 tests, a 43% defect rate! We then went through a 2 weeks iteration of unit test refinement and code fixing with a team that <em>never</em> touched the initial code, to eventually converge on 72 unit tests &#8211;many more than we could think of initially&#8211; and a usable feature.</p>
<p><strong>Conclusion</strong></p>
<p>Test-driven design (TDD) aims at capturing a spec with unit tests, then have some code successfully running these tests. The unit tests are more important than the code itself –any code that passed the unit tests meets the spec&#8211;. TDD initially requires a higher investment: writing unit tests to capture an expected behavior is a complex task, and a 3<sup>rd</sup> party review is needed to validate them. But the effort pays off: eventually the set of unit tests becomes the spec, and can even be used as documentation. Running unit tests is fast, so it dramatically reduces the R&amp;D testing time. Also once a code passes a comprehensive set of unit tests, the risk of iterating from QA back to R&amp;D is reduced. Overall, test-driven design increases code correctness and stability dramatically, even in the presence of a deficient architecture and legacy code.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/08/api-design-101/' rel='bookmark' title='Permanent Link: API design 101'>API design 101</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/' rel='bookmark' title='Permanent Link: Software outsourcing, a necessary evil'>Software outsourcing, a necessary evil</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/19/the-formal-verification-market-is-still-untapped/' rel='bookmark' title='Permanent Link: The formal verification market is still untapped'>The formal verification market is still untapped</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/10/13/test-driven-design/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>API design 101</title>
		<link>http://www.ocoudert.com/blog/2009/10/08/api-design-101/</link>
		<comments>http://www.ocoudert.com/blog/2009/10/08/api-design-101/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 13:06:36 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[EDA]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://coudert.wordpress.com/?p=247</guid>
		<description><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a>I built up products from scratch several time in my professional life. Usually it starts with a very small engineering team &#8211;sometimes I was the very first member of the team. This is a great opportunity to lay strong foundations for the subsequent software development, because one is in charge [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/10/08/api-design-101/">API design 101</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/13/test-driven-design/' rel='bookmark' title='Permanent Link: Test-driven design, a methodology for low-defect software'>Test-driven design, a methodology for low-defect software</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/' rel='bookmark' title='Permanent Link: How to write abstract iterators in C++'>How to write abstract iterators in C++</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/06/automated-low-power-design-flow-is-up-for-grabs-part-ii/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part II)'>Automated low-power design flow is up for grabs (Part II)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a>I built up products from scratch several time in my professional life. Usually it starts with a very small engineering team &#8211;sometimes I was the very first member of the team. This is a great opportunity to lay strong foundations for the subsequent software development, because one is in charge of the whole process. But one does not always have the chance to start from scratch.</p>
<p>I also worked with already established products, with larger team and millions of lines of already existing code. The typical software management and development project always offers some cumbersome legacy code and API that survive years after years. The reason is not so much that people do not want to fix the problem, but that fixing the problem requires a major product architecture overhaul, which comes to a prohibitive cost. There are striking lessons in failed software architectures, and it all start with API design. I am sharing here my practical experience with  C++ projects, but most of these advices also apply to Java.</p>
<p><strong>Why is API so important?</strong></p>
<p>An API can be a company’s greatest asset: it captures communication and exchange of services in an application. A good API will naturally lead to more reuse, simpler code, and lower maintenance cost. If the API is public, a good API will also capture customers. There are examples of Java libraries that failed to be accepted not because they were inefficient, but because they very poorly designed.</p>
<p>An API can also be a company’s greatest liability: once the service has clients, one can no longer change the API!  Suspending or rewriting an API is very pricey in terms of time and money. In the case of a public API, cost also comes in terms of reputation. A public API is forever: there is only one chance to get it right.</p>
<p><strong>What is a good API?</strong></p>
<p>In today’s object-oriented software, writing an API is providing a service. Thus instead of thinking in terms of implementation and efficiency, one must first think in terms of modules and services: determine the usage model; establish the clients’ needs; and anticipate tomorrow’s needs.</p>
<p>Besides being powerful enough to satisfy the requirements, an API should be designed with two principles in mind:</p>
<ol>
<li><strong>Keep      it simple! </strong>An API must be easy to learn and use, even without documentation. The API must be hard to misuse. Functionality should be easy to explain &#8211;if it is hard to name, it is likely a bad function. Use simple, consistent naming, and the code will read like a prose –Java libraries and STL are good inspirations for naming conventions. The API should be as small as possible: you can always add to an API, but you can never remove. A method should not take more than 3-4 parameters –else wrap the parameters in a class that can be augmented later.</li>
<li><strong>Keep      it abstract!</strong> An API must allow extension for future needs. For example, it should not assume anything about the implementation. It should minimize accessibility to implementation-specific details –an API, once public, <em>will</em> be used, and you do not want to expose the ugly details of a database.</li>
</ol>
<p>In theory, an API should be written before going into some implementation. Gathering requirements is the first step. Requirements must be case-driven, specific, and should be questioned relentlessly until proven to be must-have. The API should then be written in the target language (C++, Java, etc): this will force the development team to make choices, and to keep the API simple and abstract enough –nobody wants to have too much to discuss!  Then the API should be reviewed and made final in a public forum with the two principles above in mind: keep it simple (so that it is easy to support) and abstract (so that it is easy to extend).</p>
<p>An API should be documented, but well-designed APIs are sometimes self-explanatory. An API should answer the following questions about its components.</p>
<ol>
<li>Class:      what does an instance of a class represent?  Is that a singleton class?  Is there a factory?  Who owns the memory?</li>
<li>Method:      what does it do?  What is the      contract between the client and the instance?  Is there any precondition and post-condition?  Is there any side effect?</li>
<li>Parameters:      what do they represent?  Which      information do they carry?  Who own      them?</li>
<li>Exceptions:      who throw exceptions?  What do they      mean?  What to do when catching one?</li>
</ol>
<p><strong>API and performances</strong></p>
<p><strong> </strong></p>
<p>Bad API decision can limit performances. When designing an API, it is good to consider the following rules.</p>
<ol>
<li>Avoid      mutability. If a method returns a      mutable instance, that instance needs to be created somewhere, which raises      the question of memory ownership. Also      mutable classes limit thread-safeness. Use ‘const’ whenever possible.</li>
<li>Avoid      implicit call to copy and assignment operators. This is a waste of resources if you can      use references. Declare these      operators ‘explicit’ or ‘private’ to catch any misuse at compile time.</li>
<li>A factory      is often better than constructors. A      factory has full control on how instances are created and when they should      be released (shared model, garbage collection, save/restore, caching and disk      mirroring, etc). A factory can return      an instance of a sub-class.</li>
<li>Avoid      exposing implementation details. It      may prevent later improvements of a database. Never expose data members of a class,      always use get/set accessors.</li>
<li>Question      the thread-safeness of computational-intensive methods. One day the software may run on a grid or      in a cloud.</li>
<li>Never      compromise the rules above for a small runtime or memory improvement. For the vast majority of the      applications, going a few percents faster is not worth the maintenance      nightmare it can imply.</li>
</ol>
<p><strong>Final word</strong></p>
<p>A good API is a key to produce smaller and simpler code, which makes the product more stable and easier to maintain. Designing a good API is a collaborative effort, and a formal decision process is needed to freeze an API. A good API is hard to write, get your best people on it. And finally, a public API is forever. May these simple rules guide your next project.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/13/test-driven-design/' rel='bookmark' title='Permanent Link: Test-driven design, a methodology for low-defect software'>Test-driven design, a methodology for low-defect software</a></li>
<li><a href='http://www.ocoudert.com/blog/2010/07/07/how-to-write-abstract-iterators-in-c/' rel='bookmark' title='Permanent Link: How to write abstract iterators in C++'>How to write abstract iterators in C++</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/06/automated-low-power-design-flow-is-up-for-grabs-part-ii/' rel='bookmark' title='Permanent Link: Automated low-power design flow is up for grabs (Part II)'>Automated low-power design flow is up for grabs (Part II)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/10/08/api-design-101/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Software outsourcing, a necessary evil</title>
		<link>http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/</link>
		<comments>http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 01:10:43 +0000</pubDate>
		<dc:creator>Olivier Coudert</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[China]]></category>
		<category><![CDATA[India]]></category>
		<category><![CDATA[outsourcing]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://coudert.wordpress.com/?p=53</guid>
		<description><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a>Here are the definitions of two words that have a bad press, especially in these harsh economic times:</p>

<a href="http://www.tfd.com/outsourcing" rel="nofollow" >Outsourcing</a> (included in      dictionaries in 1979): the procuring of services or products, such as the      parts used in manufacturing a [...]<p>Continue reading <a href="http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/">Software outsourcing, a necessary evil</a></p>


Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/13/test-driven-design/' rel='bookmark' title='Permanent Link: Test-driven design, a methodology for low-defect software'>Test-driven design, a methodology for low-defect software</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/12/11/why-service-companies-will-eat-up-eda/' rel='bookmark' title='Permanent Link: Why service companies will eat up EDA'>Why service companies will eat up EDA</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/30/how-can-xilinx-improve-its-bottom-line/' rel='bookmark' title='Permanent Link: How can Xilinx improve its bottom line'>How can Xilinx improve its bottom line</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codeproject.com/script/Articles/BlogFeedList.aspx?amid=6630043" rel="nofollow" style="display: none;" rel="tag" >CodeProject</a>Here are the definitions of two words that have a bad press, especially in these harsh economic times:</p>
<ul>
<li><a href="http://www.tfd.com/outsourcing" rel="nofollow" >Outsourcing</a> (included in      dictionaries in 1979): the procuring of services or products, such as the      parts used in manufacturing a motor vehicle, from an outside supplier or      manufacturer in order to cut costs.</li>
<li><a href="http://encyclopedia.tfd.com/offshoring" rel="nofollow" >Offshoring</a>: relocation      by a company of a business process from one country to another &#8211;typically      an operational process, such as manufacturing, or supporting processes,      such as accounting.</li>
</ul>
<p>In many service and manufacturing industries, outsourcing implies that the 3<sup>rd</sup>-party provider is established abroad, where the cost of labor and production is lower, or where the environmental laws and ethic is held to a lower standard.   Signs of the times, outsourcing is often used interchangeably with offshoring.</p>
<p>Massive offshoring started with textile and clothe industry in the late 70’s.  Then came toys, TV, hotlines, help desks, cars and electronics in the 80’s, to be followed by software in the late 90’s.  Over the past 30 years, people have accepted the idea that the products they buy and use in everyday life can be produced and assembled on another continent, where the cost of labor is lower and the labor and business laws are less restrictive &#8211;today nobody expects a toy to be produced anywhere but in China.  Soon people will be insensitive to the idea that their software is designed and produced in India or China, especially if it is embedded in ubiquitous hardware like cell phones, game consoles, or digital cameras.  It will even be less of a question with web-based applications, where cloud computing and distributed data centers make physical location irrelevant.</p>
<p>Software offshoring results from a natural evolution of the industry.  Like for so many other industries, complexity required a more organized production process.  Software development evolved from a highly specialized, hand-crafted process, to an application-driven, methodology-centric, maintenance-heavy operation.  The availability of skilled labor and software development methodologies open the door to outsourcing, then offshoring.  For long held as a high-intellectual product that could only be conceived in a handful of countries in the western world, software can now be designed, produced, and maintained in any place that have access to highly educated engineers, with a relatively simple infrastructure –computers and fast internet connections.  One should rejoice to the idea of an industry that can be established anywhere innovation has the opportunity of blossoming, as opposed to a monopoly held by a few companies in a couple of countries.</p>
<p>Indeed, outsourcing of intangible products –e.g., service, consulting, design— and BPO (Business Process Outsourcing) which started in the early 80’s, got a huge boost in the 90’s.  With the tech and telecommunication bubble, massive investments in submarine cables for intercontinental high-bandwidth communication were done.  Running from Europe to India via Egypt, hub centers in Bangalore, New  Delhi, Hyderabad, Chennai, Pune, and Mumbai saw their capacity increase dramatically.  Soon real-time and reliable data exchange via the internet made high-tech outsourcing a reality.  After being a BPO bonanza, Bangalore quickly emerged as the Indian Silicon Valley.  Hundreds of software and hardware design companies set foot there, first with help centers and QA engineering, then with HW/SW supporting development teams, to finally complete design and development entities.  Other countries have developed huge HW/SW outsourcing businesses –China, Philippines, and Malaysia, to name a few, as well as some east-Europe countries.</p>
<p>Today, the cost of a software developer in India is about a third to a fourth than in the US –the figure varies depending on the industry, and it becomes cheaper as the experience and complexity requirements decrease.  In China, it will cost about a fifth to a tenth –very dependent on the industry domain, as well as the location in China.  Major US and European high-tech companies like Oracle, ST, Intel, Adobe, SAP, IBM, Microsoft, Google, Yahoo!, have very large R&amp;D campuses in India and China.  For many, their facilities in India are the biggest outside of the US.  For some, most of the R&amp;D growth is seen outside of the US/Europe.  It is not rare to see successful high-tech companies, created in the Silicon Valley 10+ years ago, but with 90% of their R&amp;D today outsourced in Asia.</p>
<p>As a consumer, pretty much nobody complains about outsourcing: in today’s world of rapid consumption of electronic gadgets and complex software, one needs to spin new products at a rapid pace and for an ever more competitive price.  However, offshoring costs jobs at home, which eventually translate to lower disposable incomes and additional social costs, both negatively impacting the local economy.  The creation of wealth in the host country has a side effect though: increasing the disposable income abroad creates new customers for the home business, thus at the end everybody may benefit from it.  This is a more positive scenario, probably true in the long run, but the lag between the disappearance of an activity and its replacement with another comes with a significant social cost.</p>
<p>Also we have seen offshoring displace industries entirely, and the intellectual-content of the displaced industry keeps increasing:  there is virtually no textile industry in Europe and in the US, and UK’s manufacturing industry is trailing in Europe.  The usual response to these displacements is that more lucrative activities replace those that moved abroad.  London has long promoted the dismantlement of its manufacturing industry via offshoring as a chance to move to a service and finance fueled economy, which produces a higher added-value.  But with the recent economic downturn driven by the finance industry, one cannot help though but question the soundness of that claim.</p>
<p>At the end, software outsourcing is here to stay: there is too much to gain for the home companies and the host countries, and the low cost of the infrastructure makes it flexible and easy to extend.  On Sand Hill it is common to hear VCs asking “What is your Indian strategy?”.  Some startups in the Bay Area even start from day one will a full software development team established in India, with just the executives, sales and support located in the US.  Needless to say, these companies could not thrive or even get started without outsourcing part of their software development.  Since they eventually contribute to the high-tech industry, one should endorse the long-term benefit.</p>
<p>Does that mean that being a SW/HW engineer in the Silicon Valley has become a high-risk job?  Software innovation still relies on individuals with bright ideas for technology and products, thus these individuals will always be in high demand.  But it has certainly become much harder for the general-purpose software developer.  The Silicon  Valley has benefited from a unique highly-educated engineer pool, entrepreneurs, and VC money.  As long as these three components remain, there is no threat in sight.  But if more and more VCs and entrepreneurs start to establish themselves in India, we will see a very serious competitor to the crown of software kingdom.  Software outsourcing will not kill the Silicon Valley.  Lack of innovation will.</p>


<p>Related posts:<ol><li><a href='http://www.ocoudert.com/blog/2009/10/13/test-driven-design/' rel='bookmark' title='Permanent Link: Test-driven design, a methodology for low-defect software'>Test-driven design, a methodology for low-defect software</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/12/11/why-service-companies-will-eat-up-eda/' rel='bookmark' title='Permanent Link: Why service companies will eat up EDA'>Why service companies will eat up EDA</a></li>
<li><a href='http://www.ocoudert.com/blog/2009/10/30/how-can-xilinx-improve-its-bottom-line/' rel='bookmark' title='Permanent Link: How can Xilinx improve its bottom line'>How can Xilinx improve its bottom line</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.ocoudert.com/blog/2009/09/20/software-outsourcing-a-necessary-evil/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
