{"id":1135,"date":"2021-10-11T17:53:13","date_gmt":"2021-10-11T17:53:13","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=1135"},"modified":"2025-08-06T18:36:45","modified_gmt":"2025-08-06T18:36:45","slug":"coverpoints-y-cross","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=1135","title":{"rendered":"Coverpoints y cross"},"content":{"rendered":"\n\n\n<p class=\"wp-block-paragraph\">Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbit &#x5B;1:0] b;\nenum{a,b,c} letter;\ncovergroup cg @(negedge clk);\n  bcov: coverpoint b;\n  lettercov: coverpoint letter;\nendgroup\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>En principio, cuando se muestrea las variables \u00abb\u00bb y \u00abletter\u00bb se crea 4 \u201cbins\u201d para bcov, 3 para lettercov (uno por cada valor posible) <\/li>\n\n\n\n<li>Para tipos de datos de 4 valores l\u00f3gicos, X y Z nunca se graban <\/li>\n\n\n\n<li>Los \u201cbins\u201d son como contadores: cada vez que se activa el grupo de cobertura , el \u201cbin\u201d se incrementa en uno.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u00abAutomatic bins\u00bb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Estos \u00abbins\u00bb son autom\u00e1ticamente creados y tienen un l\u00edmite cuando los casos posibles para la variable afectada son muy elevados (por ejemplo un entero).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hay un n\u00famero m\u00e1ximo de \u201cautomatically-created bins\u201d, por defecto 1024. Si el n\u00famero de valores que puede tomar un punto de cobertura es superior a 1024, el conjunto de todos los valores posibles se \u201cdistribuye\u00bb autom\u00e1ticamente<\/strong> <\/li>\n\n\n\n<li>En este caso se crear\u00e1n 1024 contenedores \u2013 with MAXINT=2^32:<ul><li>\u00a0\u00a0\u00a0 [0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 , \u2026 , MAXINT\/1024-1]<\/li><li>\u00a0\u00a0\u00a0 [MAXINT\/1024\u00a0\u00a0\u00a0\u00a0\u00a0 , \u2026 , 2*MAXINT\/1024-1]<\/li><\/ul>\n<ul class=\"wp-block-list\">\n<li>\u00a0\u00a0\u00a0 \u2026<\/li>\n\n\n\n<li>\u00a0\u00a0\u00a0 [1022*MAXINT\/1024 , \u2026 , 1023*MAXINT\/1024-1]<\/li>\n\n\n\n<li>\u00a0\u00a0\u00a0 [1023*MAXINT\/1024 , \u2026 , MAXINT-1]<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Definici\u00f3n manual de bins<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbit &#x5B;9:0] v_a;\ncovergroup cg @(negedge clk);\n  coverpoint v_a\n  {\n    bins a      = { &#x5B;0:63],65 }; \/\/ values from 0 to 63 or 65\n    bins b&#x5B;]    = { 200,201,202 }; \/\/ creates 3 bins\n    bins c      = { &#x5B;1000:$] }; \/\/ from 1000 to 1023\n    bins d&#x5B;]    = { &#x5B;10:14], &#x5B;16:18]}; \/\/ creates 7 bins\n    bins others = default; \/\/ everything else\n  }\nendgroup\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>a: 1 bin, Incrementado si v_a es 65 o est\u00e1 entre 0 y 63<\/li>\n\n\n\n<li>b: 3 bins, cada uno de ellos se incrementa cuando v_a toma los valores 200, 201, 202<\/li>\n\n\n\n<li>c: 1 bin, incrementado cuando\u00a0 v_a est\u00e1 entre\u00a0 1000 y 1023<\/li>\n\n\n\n<li>d: 8 bins, cada uno de ellos se incrementa cuando v_a toma los valores 10, 11, 12, 13, 14, 16, 17, 18<\/li>\n\n\n\n<li>otros: 1 bin, incrementado cuando v_a toma cualquier valor que no est\u00e9 cubierto por los otros \u201cbins\u201d<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">wildcard bins<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>wildcard bins <\/strong>a={4\u2019b11xx}; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e1lido para 1100, 1101, 1110 y 1111 <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como s\u00edmbolo para el \u201cwildcard\u201d podemos usar <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>x <\/li>\n\n\n\n<li>z <\/li>\n\n\n\n<li>?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ignore bins<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\ncovergroup cg @(negedge clk);\n  coverpoint v_a\n  {\n    ignore_bins ib = {0, 1, 2};\n    bins three ={3};\n    bins four = {4};\n  }\nendgroup\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>No nos importa cuando v_a toma los valores 0, 1, 2<\/strong> .<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Estos valores se excluyen de la cobertura<\/li>\n\n\n\n<li>La herramienta no se\u00f1alar\u00e1 ninguna falta de cobertura si v_a nunca fue 0, 1 o 2. <\/li>\n\n\n\n<li>Si v_a nunca fue 3 entonces ese \u201cbin\u201d esta no cubierto \u2013 coverage hole <\/li>\n\n\n\n<li>Puede ser \u00fatil para los valores que el banco de pruebas nunca debe generar<\/li>\n\n\n\n<li>Ejemplo: el banco de pruebas genera n\u00fameros pares aleatorios, todos los n\u00fameros impares se pueden definir como ignore_bins.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">illegal bins<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\ncovergroup cg @(negedge clk);\n  coverpoint v_a\n  {\n    illegal_bins ib = {0, 1, 2};\n    bins three ={3};\n    bins four = {4};\n  }\nendgroup\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Si v_a toma los valores 0, 1 o 2 obtenemos un error en tiempo de ejecuci\u00f3n.<\/strong> <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Puede ser \u00fatil para los valores que el DUT nunca debe generar<\/li>\n\n\n\n<li>Ejemplo: si el DUT debe dar en la salida un n\u00famero par, todos los n\u00fameros impares se pueden definir como illegal_bins. Si se encuentra un n\u00famero impar, significa que hay un error en el DUT.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cross coverage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbit &#x5B;3:0] a, b;\ncovergroup cov @(posedge clk);\n  aXb : cross a, b;\nendgroup\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">16&#215;16 automatic bins, una por cada combinaci\u00f3n de valores de <strong>a<\/strong> y <strong>b<\/strong> <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00bfcu\u00e1ntas veces a fue 0 y b fue 0 en el mismo ciclo?<\/li>\n\n\n\n<li>\u00bfcu\u00e1ntas veces a fue 0 y b fue 1 en el mismo ciclo?<\/li>\n\n\n\n<li>\u2026 <\/li>\n\n\n\n<li>\u00bfcu\u00e1ntas veces a fue 15 y b fue 14 en el mismo ciclo?<\/li>\n\n\n\n<li>\u00bfcu\u00e1ntas veces a fue 15 y b fue 15 en el mismo ciclo?<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u00abAutomatic cross bins\u00bb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>cross entre varias variables<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nenum { red, green, blue } color;\nbit &#x5B;3:0] pixel_adr, pixel_offset, pixel_hue;\ncovergroup g2 @(posedge clk);\n  Hue: coverpoint pixel_hue; \/\/ 16 bins\n  Offset: coverpoint pixel_offset; \/\/ 16 bins\n  AxC: cross color, pixel_adr; \/\/ 3*16 bins\n  all: cross color, Hue, Offset; \/\/ 3*16*16 bins\nendgroup\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>cross entre una variable y un coverpoint<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbit &#x5B;31:0] a_var;\nbit &#x5B;3:0] b_var;\ncovergroup cov3 @(posedge clk);\n  A: coverpoint a_var { bins yy&#x5B;] = { &#x5B;0:9] }; }\n  CC: cross b_var, A;\nendgroup\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Tenemos 16&#215;10 bins en CC<strong>.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00abManual  cross bins\u00bb<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbit &#x5B;7:0] v_a, v_b;\ncovergroup cg @(posedge clk);\na: coverpoint v_a {\nbins a1 = { &#x5B;0:63] };\nbins a2 = { &#x5B;64:127] };\nbins a3 = { &#x5B;128:191] };\nbins a4 = { &#x5B;192:255] };\n}\nb: coverpoint v_b {\nbins b1 = {0};\nbins b2 = { &#x5B;1:84] };\nbins b3 = { &#x5B;85:169] };\nbins b4 = { &#x5B;170:255] };\n}\nc : cross a, b {  \/\/ 16 bins\nbins         c1 = !binsof(a.a4);               \/\/ 12 bins\nillegal_bins c2 = binsof(a.a2) || binsof(b.b2);\/\/ 7 cross products\nignore_bins  c3 = binsof(a.a1) &amp;amp;&amp;amp; binsof(b.b4);\/\/ 1 cross product\n}\nendgroup\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Bins de transiciones<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hasta ahora hemos muestreado situaciones monociclo de las variables implicadas en coverpoints y cross. Pero los bins a cubrir, podr\u00edan hacer referencias a situaciones multiciclo<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins a = (value1 =&gt; value2<\/strong>;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cuenta cu\u00e1ntas veces la variable ten\u00eda valor1 y en el siguiente tiempo de muestreo ten\u00eda valor2<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins a = (1 =&gt; 3 =&gt; 4)<\/strong>;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cuenta cu\u00e1ntas veces variable \u00a0ten\u00eda valor 1, entonces 3, entonces 4. <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins a = (1,5 =&gt; 6, 7)<\/strong>;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cuenta cu\u00e1ntas veces la variable ten\u00eda valor 1 o 5 y luego tenia el valor 6 o 7 (transiciones 1=>6, 1=>7, 5=>6, 5=>7)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = (4 =&gt; 5 =&gt; 6), ([7:9],10=&gt;11,12); <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un bin que es incrementado para las siguientes transiciones:\n<ul class=\"wp-block-list\">\n<li>4=>5=>6 <\/li>\n\n\n\n<li>7=>11 <\/li>\n\n\n\n<li>8=>11 <\/li>\n\n\n\n<li>9=>11 <\/li>\n\n\n\n<li>10=>11 <\/li>\n\n\n\n<li>7=>12<\/li>\n\n\n\n<li>8=>12 <\/li>\n\n\n\n<li>9=>12 <\/li>\n\n\n\n<li>10=>12<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa [] = (4 =&gt; 5 =&gt; 6), ([7:9],10=&gt;11,12); <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>9 bins que son incrementados para las siguientes transiciones:\n<ul class=\"wp-block-list\">\n<li>4=>5=>6 <\/li>\n\n\n\n<li>7=>11 <\/li>\n\n\n\n<li>8=>11 <\/li>\n\n\n\n<li>9=>11 <\/li>\n\n\n\n<li>10=>11 <\/li>\n\n\n\n<li>7=>12<\/li>\n\n\n\n<li>8=>12 <\/li>\n\n\n\n<li>9=>12 <\/li>\n\n\n\n<li>10=>12<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>wildcard<\/strong><strong> <\/strong><strong>bins<\/strong><strong> <\/strong>T0 = (2\u2019b0x =&gt; 2\u2019b1x);<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este Bin se incrementa si tenenos las siguientes transiciones\n<ul class=\"wp-block-list\">\n<li>00 => 10;<\/li>\n\n\n\n<li> 01 => 10; <\/li>\n\n\n\n<li>00 => 11; <\/li>\n\n\n\n<li>01 => 10;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>illegal_bins<\/strong><strong> <\/strong>bad_trans = (4=&gt;5=&gt;6); <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ignore_bins <\/strong>bad_trans = (4=&gt;5=&gt;6);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = (3 [* 3]) <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es equivalente a (3 => 3 => 3) <\/li>\n\n\n\n<li>Note: si tenemos cuatro 3 consecutivos, entonces el \u201cbin\u201d se incrementar\u00e1 en dos: SOLAPAMIENTO<\/li>\n\n\n\n<li>(3 [*3:5]) es equivalente a (3 => 3 => 3), (3 => 3 => 3 => 3), (3 => 3 => 3 => 3 => 3)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = (2 =&gt; 3 [* 3] =&gt; 1) <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es equivalente a <\/li>\n\n\n\n<li>(2 => 3 => 3 => 3 => 1) <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = (1 =&gt; 3 [*3:5]) 3] =&gt; 1) <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es equivalente a <\/li>\n\n\n\n<li>(1=>3=>3=>3),(1=>3=>3=>3=>3),(1=>3=>3=>3=>3=>3)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = (1 =&gt; 3 [*4:$] =&gt; 2)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es equivalente a <\/li>\n\n\n\n<li>que hay un 1 seguido de al menos 4 veces un 3, seguido de un 2.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>bins <\/strong>sa = 1=&gt;3 [-&gt; 3]=&gt;5<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>es equivalente a <\/li>\n\n\n\n<li>1=>\u2026=>3=>\u2026=>3=>\u2026=>3=>5<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veamos el siguiente ejemplo: \u00abAutomatic bins\u00bb Estos \u00abbins\u00bb son autom\u00e1ticamente creados y tienen un l\u00edmite cuando los casos posibles para la variable afectada son muy elevados (por ejemplo un entero). Definici\u00f3n manual de bins Veamos el siguiente ejemplo: wildcard bins wildcard bins a={4\u2019b11xx}; V\u00e1lido para 1100, 1101, 1110 y 1111 Como s\u00edmbolo para el \u201cwildcard\u201d podemos usar ignore bins No nos importa cuando v_a toma los valores 0, 1, 2 . illegal bins Si v_a toma los valores 0, 1 o 2 obtenemos un error en tiempo de ejecuci\u00f3n. Cross coverage Veamos el siguiente ejemplo: 16&#215;16 automatic bins, una por cada combinaci\u00f3n de valores de a y b \u00abAutomatic cross bins\u00bb cross entre varias variables cross entre una variable y un coverpoint Tenemos 16&#215;10 bins en CC. \u00abManual cross bins\u00bb Bins de transiciones Hasta ahora hemos muestreado situaciones monociclo de las variables implicadas en coverpoints y cross. Pero los bins a cubrir, podr\u00edan hacer referencias a situaciones multiciclo bins a = (value1 =&gt; value2; bins a = (1 =&gt; 3 =&gt; 4); bins a = (1,5 =&gt; 6, 7); bins sa = (4 =&gt; 5 =&gt; 6), ([7:9],10=&gt;11,12); bins sa [] = (4 =&gt; 5 =&gt; 6), ([7:9],10=&gt;11,12); wildcard bins T0 = (2\u2019b0x =&gt; 2\u2019b1x); illegal_bins bad_trans = (4=&gt;5=&gt;6); ignore_bins bad_trans = (4=&gt;5=&gt;6); bins sa = (3 [* 3]) bins sa = (2 =&gt; 3 [* 3] =&gt; 1) bins sa = (1 =&gt; 3 [*3:5]) 3] =&gt; 1) bins sa = (1 =&gt; 3 [*4:$] =&gt; 2) bins sa = 1=&gt;3 [-&gt; 3]=&gt;5<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":"","footnotes":""},"class_list":["post-1135","page","type-page","status-publish","hentry"],"featured_image_src":null,"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1135"}],"version-history":[{"count":17,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1135\/revisions"}],"predecessor-version":[{"id":1178,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1135\/revisions\/1178"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}