{"id":21442266,"url":"https://github.com/thotypous/arq1_pac","last_synced_at":"2026-02-17T14:02:22.076Z","repository":{"id":69726794,"uuid":"207126459","full_name":"thotypous/arq1_pac","owner":"thotypous","description":"Atividade de Avaliação Complementar de Arq1 (2019/1)","archived":false,"fork":false,"pushed_at":"2019-09-08T16:16:16.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-12T20:32:00.408Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Bluespec","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thotypous.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-08T14:42:17.000Z","updated_at":"2019-09-08T16:52:41.000Z","dependencies_parsed_at":"2023-03-11T07:07:37.820Z","dependency_job_id":null,"html_url":"https://github.com/thotypous/arq1_pac","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thotypous/arq1_pac","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Farq1_pac","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Farq1_pac/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Farq1_pac/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Farq1_pac/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thotypous","download_url":"https://codeload.github.com/thotypous/arq1_pac/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Farq1_pac/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278518900,"owners_count":26000177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-23T01:53:16.351Z","updated_at":"2025-10-05T20:56:07.695Z","avatar_url":"https://github.com/thotypous.png","language":"Bluespec","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introdução\n\nO arquivo [DotProd.bsv](DotProd.bsv) calcula o [produto interno](https://pt.wikipedia.org/wiki/Produto_interno#Exemplos) entre dois vetores de ponto flutuante, cada um deles previamente armazenado em uma memória do tipo BRAM.\n\nOs vetores de teste que vieram junto com esta atividade são os seguintes:\n\n```\na = [ 1.5, 4.,   2.  ]\nb = [ 2.,  0.25, 0.1 ]\n```\n\nO produto interno entre eles é `1.5 * 2. + 4. * 0.25 + 2. * 0.1`, que resulta em `4.2`.\n\nA implementação que veio com esta atividade utiliza uma máquina de estados para fazer a conta. No estado `ReqLoad`, ela requisita às memórias o número contido no endereço atual. No estado `ReqMult`, ela solicita ao submódulo `mac` que multiplique e acumule (some com o valor atual de `result`) esses dois números. No estado `Accum`, ela grava o valor acumulado até o momento de volta no registrador `result` e verifica se já terminou de fazer a conta ou não.\n\nO submódulo `mac` tem uma interface do tipo `Server#(Tuple4#(Maybe#(Float), Float, Float, RoundMode), Tuple2#(Float,Exception))`. Isso significa que ele recebe uma requisição que consiste em três valores de ponto flutuante (no nosso código, esses três valores são `result`, `valueA` e `valueB`), sendo que o primeiro deles é opcional (por isso está dentro de um `Maybe`), e um modo de arrendondamento (no nosso código, usamos o modo padrão, por isso escrevemos `defaultValue`). Após terminar de calcular `result + valueA * valueB`, o submódulo produz uma resposta que consiste em um número de ponto flutuante (o resultado parcial) e um possível código de exceção (no nosso código, ignoramos exceções).\n\nPara testar o código, execute `make test`:\n\n```\n$ make test\n./dotprod | ./convfloats.py\nRequisitando da memória o endereço 0\nObtive da memória: 1.5000 e 2.0000, multiplicando\nValor acumulado até o momento: 3.0000\nRequisitando da memória o endereço 1\nObtive da memória: 4.0000 e 0.2500, multiplicando\nValor acumulado até o momento: 4.0000\nRequisitando da memória o endereço 2\nObtive da memória: 2.0000 e 0.1000, multiplicando\nValor acumulado até o momento: 4.2000\n\nProduto interno finalizado. Resultado: 4.2000\nCiclos gastos:         36\n```\n\n\n# Questão 1 (conceitual)\n\nO submódulo `mac` possui uma característica interessante: dentro dele há um *pipeline*. Isso significa que depois de pedir para ele fazer uma conta do tipo `result + valueA * valueB`, no próximo ciclo já é possível solicitar que ele comece a fazer uma nova conta com outros valores, mesmo antes da resposta à primeira conta estar pronta.\n\nSabendo disso, responda: Por que **não** é possível simplesmente remover a máquina de estados e transformar as regras `reqLoad`, `reqMult` e `accum` em estágios de um *pipeline*, a fim de conseguir obter o resultado final do produto interno em um número menor de ciclos?\n\n\n# Questão 2 (codificação)\n\nSuponha que, em vez de calcular o produto interno, desejemos fazer só as multiplicações. Ou seja, não queremos fazer as somas. Neste caso, você deve ser capaz de transformar as regras `reqLoad`, `reqMult` e `accum` em estágios de um *pipeline*.\n\nModifique seu código para fazê-lo. O resultado deve ficar parecido com:\n\n```\nRequisitando da memória o endereço 0\nRequisitando da memória o endereço 1\nObtive da memória: 1.5000 e 2.0000, multiplicando\nRequisitando da memória o endereço 2\nObtive da memória: 4.0000 e 0.2500, multiplicando\nObtive da memória: 2.0000 e 0.1000, multiplicando\nResultado da multiplicação: 3.0000\nResultado da multiplicação: 1.0000\nResultado da multiplicação: 0.2000\nCiclos gastos:         13\n```\n\n**Atenção** à quantidade de ciclos gastos, que deve ser menor ou igual a 13.\n\n\n# Questão 3 (codificação)\n\nExiste um operador `+` para fazer a soma entre dois números de ponto flutuante de forma combinacional. Segue abaixo um exemplo de uso desse operador:\n\n```bluespec\nlet acc = result + partial;\nresult \u003c= acc;\n```\n\nEsse operador não é muito usado com números de ponto flutuante pois o caminho crítico do circuito correspondente geralmente é longo demais para ser considerado aceitável.\n\nNo entanto, caso ele seja usado, é possível manter a construção de *pipeline* da questão anterior e chegar ao resultado final do produto interno, como na saída abaixo:\n\n```\nRequisitando da memória o endereço 0\nRequisitando da memória o endereço 1\nObtive da memória: 1.5000 e 2.0000, multiplicando\nRequisitando da memória o endereço 2\nObtive da memória: 4.0000 e 0.2500, multiplicando\nObtive da memória: 2.0000 e 0.1000, multiplicando\nResultado da multiplicação: 3.0000\nResultado da multiplicação: 1.0000\nResultado da multiplicação: 0.2000\n\nResultado final: 4.2000\nCiclos gastos:         13\n```\n\nModifique seu código para fazê-lo. **Atenção** à quantidade de ciclos gastos, que deve ser menor ou igual a 13.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthotypous%2Farq1_pac","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthotypous%2Farq1_pac","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthotypous%2Farq1_pac/lists"}