AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77045498
Accepted
gubang
gubang
Asked: 2023-09-05 22:42:27 +0800 CST2023-09-05 22:42:27 +0800 CST 2023-09-05 22:42:27 +0800 CST

Não consigo entender quais duas unidades de atribuição estão em conflito

  • 772

Tentei fazer o relógio que conta o tempo dado que o ciclo de clk é de um minuto. Mas tive dificuldade em descobrir quais duas tarefas estão em conflito. (Estou procurando há dois dias, mas não consegui encontrar)

Primeiro tentei esses códigos no playground da EDA.

//code for "design.sv"

module clock(
  input clk, rstn,
  output reg[6:0] minute,      //line 1
  output reg[5:0] hour         //line 2
);

  
  always @ (posedge clk, negedge rstn) begin
    if(!rstn) begin
        minute <= 0; hour = 0;
        end
    else begin
        minute = minute + 1;
        end
  end
  
  always @ (posedge clk) begin
    if((minute%60==0)&&(minute != 0)) begin
        minute <= 0;
        hour = hour + 1;
        end
    
    if((hour%24==0)&&(hour !=0)) hour <= 0;
  end
  
  
endmodule

//code for "testbench.sv"
module test;
  reg clk, rstn;
  reg [6:0] minute;
  reg [5:0] hour;
  
  initial begin
    clk = 0;
    forever #5 clk = ~clk;
  end
  
  initial begin
    rstn = 1; minute = 0; hour = 0;    //line 3
    #30 rstn = 0;
    #1 rstn = 1;
    #600 $finish;
  end
  
  clock clock_inst(clk, rstn, minute, hour);
  
  initial begin
    $dumpfiles("wave.vcd");
    $dumpvars(0, test);
  end
  
endmodule

Simulei esses primeiros códigos e recebi o erro abaixo.

A "variável ""minuto"" não pode ser controlada pelas instruções de atribuição processual e contínua. A "variável ""hora"" não pode ser controlada pelas instruções de atribuição processual e contínua.

Minha primeira conclusão: concluí que as atribuições de line 1e line 2estão em conflito com as de line 3. Eu pensei output reg minutee output reg hourem clock_instsão tarefas contínuas implícitas. Conseqüentemente line 1, line 2entra em conflito com atribuições em minutee hour(colocadas em line 3) levando ao problema de multidriver em uma variável.

Porém, para verificar minha conclusão, revisei o código conforme abaixo.

//revised code for "design.sv"

module clock(
  input clk, rstn,
  output reg[6:0] minute, 
  output reg[5:0] hour
);

  
  initial begin        // newly added block
    minute = 0; hour = 0;
  end
  
  always @ (posedge clk, negedge rstn) begin
    if(!rstn) begin
        minute <= 0; hour = 0;
        end 
    else begin
        minute = minute + 1;
        end
  end
  
  always @ (posedge clk) begin
    if((minute%60==0)&&(minute != 0)) begin
        minute <= 0;
        hour = hour + 1;
        end
    
    if((hour%24==0)&&(hour !=0)) hour <= 0;
  end
  
  
endmodule

//revised code for "testbench.sv"

module test;
  reg clk, rstn;
  reg [6:0] minute;
  reg [5:0] hour;
  
  initial begin
    clk = 0;
    forever #5 clk = ~clk;
  end
  
  initial begin
    rstn = 1;          //revised line
    #30 rstn = 0;
    #1 rstn = 1;
    #600 $finish;
  end
  
  clock clock_inst(clk, rstn, minute, hour);
  
  initial begin
    $dumpfiles("wave.vcd");
    $dumpvars(0, test);
  end
  
endmodule

O que pensei é que esses códigos me dariam erros porque a atribuição newly added blockentraria em conflito com output reg[6:0] minuteas output reg[5:0] houratribuições.

Mas funcionou muito bem

VSIM: A simulação foi concluída. Não há mais vetores de teste para simular.

VSIM: A simulação foi concluída.

Agora, não consigo encontrar quais linhas constigiam erros de multi-condução em meu primeiro código.

verilog
  • 1 1 respostas
  • 35 Views

1 respostas

  • Voted
  1. Best Answer
    Mikef
    2023-09-05T23:02:04+08:002023-09-05T23:02:04+08:00

    No código original, a variável minuteé controlada por mais de um alwaysbloco.

    Essa é a definição de vários drivers e não será sintetizada.

    A solução é colocar todos os drivers para as variáveis ​​em um bloco sempre.
    Assim:

      always @ (posedge clk, negedge rstn) begin
        if(!rstn) begin
           minute <= 0;
           hour   <= 0;
        end
        
        else begin
    
            if(minute < 60) 
              minute <= minute + 1;
            else
              minute <= 0;
    
            if(minute < 24) 
              hour   <= hour + 1;
            else
              hour   <= 0;
          
        end
      end  
    

    O operador de módulo não será bem sintetizado, exceto nos casos em que você estiver usando um módulo que é uma potência de 2 ^ N, exemplo: 2,4,8,16,32...

    Além disso, tome cuidado para sempre usar atribuições sem bloqueio <=em um bloco sempre síncrono, em vez de bloquear atribuições =. Usar atribuições de bloqueio em um bloco sempre síncrono pode causar comportamento incompatível de simulação/síntese.

    O que você está vendo no código revisado é um exemplo do simulador que não detecta corretamente os vários drivers associados ao alwaysbloco verilog na simulação. A instrução SystemVerilog always_ffcorrige isso e detectará consistentemente um erro de múltiplos drivers na simulação e síntese.

    Para demonstrar, mudei os alwaysblocos para always_ffe corri novamente no playground eda.
    Assim:

    module clock(
      input clk, rstn,
      output reg[6:0] minute, 
      output reg[5:0] hour
    );
    
      
      initial begin        // newly added block
        minute = 0; hour = 0;
      end
      
      always_ff @ (posedge clk, negedge rstn) begin
        if(!rstn) begin
            minute <= 0; hour = 0;
            end 
        else begin
            minute = minute + 1;
            end
      end
      
      always_ff @ (posedge clk) begin
        if((minute%60==0)&&(minute != 0)) begin
            minute <= 0;
            hour = hour + 1;
            end
        
        if((hour%24==0)&&(hour !=0)) hour <= 0;
      end
      
    endmodule
    

    Produz:

        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable minute detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk, negedge rstn) begin
                  |
        xmelab: *E,MULAXX (./design.sv,13|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
          always_ff @ (posedge clk) begin
                  |
        xmelab: *E,MULAXX (./design.sv,22|10): Multiple drivers to always_ff output variable hour detected.
        xrun: *E,ELBERR: Error during elaboration (status 1), exiting.
    

    Usando Cadence e similares usando Modelsim/Questa.

    always_ffpeguei os vários drivers e alwaysperdi na simulação.

    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve