{"id":734,"date":"2020-12-04T13:44:02","date_gmt":"2020-12-04T13:44:02","guid":{"rendered":"http:\/\/dsd.webs.upv.es\/?p=734"},"modified":"2021-10-07T11:03:02","modified_gmt":"2021-10-07T11:03:02","slug":"risc-v-instrucciones-auipc-y-lui-en-la-implementacion-monociclo","status":"publish","type":"post","link":"https:\/\/dsd.webs.upv.es\/?p=734","title":{"rendered":"RISC-V: Instrucciones auipc y lui en la implementaci\u00f3n monociclo."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Para hacer compatible los programas desarrollados en Venus en nuestra implementaci\u00f3n monociclo del RISC-V, ser\u00eda muy \u00fatil el uso en nuestro RISC-V de instrucciones para cargar direcciones de memoria en registros, como puede ser <strong>la<\/strong> (load address) o <strong>li<\/strong> (load immediate).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las instrucciones <strong>la y li<\/strong> son realmente pseudoinstrucciones. El compilador crea dos instrucciones para <strong>la  (auipc + addi)<\/strong> y dos instrucciones para<strong> li (lui+addi)<\/strong>. En los dos casos se hace uso de una instrucci\u00f3n de tipo <strong>U-Format<\/strong> (auipc y lui).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este post, la idea es mostrar una sugerencia de implementaci\u00f3n de estas instrucciones U-Format en nuestro RISC-V monociclo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Instrucciones U-Format<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si nos fijamos en la estructura de una instrucciones U-Format vemos que tienen un registro destino y un inmediato de 20 bits<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"904\" height=\"171\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image.png\" alt=\"\" class=\"wp-image-735\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image.png 904w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-300x57.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-768x145.png 768w\" sizes=\"auto, (max-width: 904px) 100vw, 904px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para los otros formatos de instrucciones los inmediatos eran de 12 bits y por tanto no nos permiten cargar valores de 32 bits en los registros.  Para resolver esto tenemos las instrucciones de tipo <strong>U-Format<\/strong> que permiten hacer escrituras en los 20 bits de mayor peso de los registros. De esta forma combinando instrucciones U-Format e I-Format podemos cargar valores de 32bits ({20bits,12bits}) en los registros (es lo que hace la y li).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La instrucci\u00f3n lui<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La instrucci\u00f3n lui realiza la siguiente operaci\u00f3n:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>rd={instr[31:12],12&#8217;d0}<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se puede implementar como una generaci\u00f3n de inmediato y una suma de este inmediato con 32&#8217;d0. El resultado de la suma se guarda en el registro rd. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La instrucci\u00f3n auipc:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La instrucci\u00f3n auipc realiza la siguiente operaci\u00f3n:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>rd={instr[31:12],12&#8217;d0} +PC<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se puede implementar mediante la generaci\u00f3n de un inmediato y una suma de este inmediato con el PC. El resultado de la suma se guarda en el registro rd.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sugerencia de Implementaci\u00f3n en el RISC-V <\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En la siguiente imagen sugiero una posible implementaci\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"824\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2-1024x824.png\" alt=\"\" class=\"wp-image-737\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2-1024x824.png 1024w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2-300x241.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2-768x618.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2.png 1342w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En esta implementaci\u00f3n lo cambios m\u00e1s importantes est\u00e1n en:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Bloque de entrada de la ALU<\/strong>: Antes la ALU pod\u00eda realizar operaciones entre Registro y Registro o entre Registro e inmediato. Ahora a\u00f1adimos un multiplexor nuevo que nos permite realizar operaciones entre 0  e Inmediato y PC con Inmediato.<\/li><li><strong>Generador de Inmediato<\/strong>: Debemos a\u00f1adir la opci\u00f3n de generaci\u00f3n de inmediatos para instrucciones U-Format. Inmediato={instr[31:12],12&#8217;d0}<\/li><li><strong>Control<\/strong>: <ul><li>Debemos a\u00f1adir la <strong>se\u00f1al de control AuipcLui<\/strong>: Esta se\u00f1al selecciona la fuente de entrada a la ALU. Cuando tenemos una instrucci\u00f3n Auipc entonces la se\u00f1al AuipcLui=2&#8217;d0 para que la ALU opere con el PC; cuando tenemos una instrucci\u00f3n Lui entonces la se\u00f1al AuipcLui=2&#8217;d1 para que la ALU tenga un 0 en una de sus entradas. En las instrucciones I-Format, R-Format, &#8230; AuipcLui=2&#8217;d2.<\/li><li><strong>ALUOp<\/strong>: ALUOp debe indicar a ALU control que la ALU siempre sume cuando tenemos una instrucci\u00f3n U-Format. Para esto podemos aprovechar el mismo ALUOp de las instrucciones sw y lw donde la ALU siempre suma.<\/li><\/ul><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Para hacer compatible los programas desarrollados en Venus en nuestra implementaci\u00f3n monociclo del RISC-V, ser\u00eda muy \u00fatil el uso en nuestro RISC-V de instrucciones para cargar direcciones de memoria en registros, como puede ser la (load address) o li (load immediate). Las instrucciones la y li son realmente pseudoinstrucciones. El compilador crea dos instrucciones para la (auipc + addi) y dos instrucciones para li (lui+addi). En los dos casos se hace uso de una instrucci\u00f3n de tipo U-Format (auipc y lui). En este post, la idea es mostrar una sugerencia de implementaci\u00f3n de estas instrucciones U-Format en nuestro RISC-V monociclo. Instrucciones U-Format Si nos fijamos en la estructura de una instrucciones U-Format vemos que tienen un registro destino y un inmediato de 20 bits Para los otros formatos de instrucciones los inmediatos eran de 12 bits y por tanto no nos permiten cargar valores de 32 bits en los registros. Para resolver esto tenemos las instrucciones de tipo U-Format que permiten hacer escrituras en los 20 bits de mayor peso de los registros. De esta forma combinando instrucciones U-Format e I-Format podemos cargar valores de 32bits ({20bits,12bits}) en los registros (es lo que hace la y li). La instrucci\u00f3n lui: La instrucci\u00f3n lui realiza la siguiente operaci\u00f3n: rd={instr[31:12],12&#8217;d0} Se puede implementar como una generaci\u00f3n de inmediato y una suma de este inmediato con 32&#8217;d0. El resultado de la suma se guarda en el registro rd. La instrucci\u00f3n auipc: La instrucci\u00f3n auipc realiza la siguiente operaci\u00f3n: rd={instr[31:12],12&#8217;d0} +PC Se puede implementar mediante la generaci\u00f3n de un inmediato y una suma de este inmediato con el PC. El resultado de la suma se guarda en el registro rd. Sugerencia de Implementaci\u00f3n en el RISC-V En la siguiente imagen sugiero una posible implementaci\u00f3n: En esta implementaci\u00f3n lo cambios m\u00e1s importantes est\u00e1n en: Bloque de entrada de la ALU: Antes la ALU pod\u00eda realizar operaciones entre Registro y Registro o entre Registro e inmediato. Ahora a\u00f1adimos un multiplexor nuevo que nos permite realizar operaciones entre 0 e Inmediato y PC con Inmediato. Generador de Inmediato: Debemos a\u00f1adir la opci\u00f3n de generaci\u00f3n de inmediatos para instrucciones U-Format. Inmediato={instr[31:12],12&#8217;d0} Control: Debemos a\u00f1adir la se\u00f1al de control AuipcLui: Esta se\u00f1al selecciona la fuente de entrada a la ALU. Cuando tenemos una instrucci\u00f3n Auipc entonces la se\u00f1al AuipcLui=2&#8217;d0 para que la ALU opere con el PC; cuando tenemos una instrucci\u00f3n Lui entonces la se\u00f1al AuipcLui=2&#8217;d1 para que la ALU tenga un 0 en una de sus entradas. En las instrucciones I-Format, R-Format, &#8230; AuipcLui=2&#8217;d2. ALUOp: ALUOp debe indicar a ALU control que la ALU siempre sume cuando tenemos una instrucci\u00f3n U-Format. Para esto podemos aprovechar el mismo ALUOp de las instrucciones sw y lw donde la ALU siempre suma.<\/p>\n","protected":false},"author":6,"featured_media":737,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[42],"tags":[47,46,44,48],"class_list":["post-734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-risc-v","tag-auipc","tag-lui","tag-risc-v","tag-u-format"],"featured_image_src":"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2020\/12\/image-2.png","author_info":{"display_name":"Jos\u00e9 Monz\u00f3 Ferrer","author_link":"https:\/\/dsd.webs.upv.es\/?author=6"},"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=734"}],"version-history":[{"count":3,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/734\/revisions"}],"predecessor-version":[{"id":743,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/734\/revisions\/743"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/media\/737"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}