2014-09-20 3 views
0

J'essaye de déboguer mon code montré ci-dessous. Je suis relativement nouveau à SystemVerilog et j'espère pouvoir en tirer des leçons. Faites-moi savoir des suggestions.Diviseur de huit bits: Quotient et reste

Les erreurs que je reçois sont:

Error-[ICPD] Invalid procedural driver combination 
"divide.v", 2 
Variable "Q" is driven by an invalid combination of procedural drivers. 
Variables written on left-hand of "always_comb" cannot be written to by any 
other processes, including other "always_comb" processes. 
"divide.v", 2: logic [7:0] Q; 
"divide.v", 8: always_comb begin 
if (x <= R) begin 
... 
"divide.v", 5: Q = 8'b0; 

Error-[ICPD] Invalid procedural driver combination 
"divide.v", 2 
Variable "R" is driven by an invalid combination of procedural drivers. 
Variables written on left-hand of "always_comb" cannot be written to by any 
other processes, including other "always_comb" processes. 
"divide.v", 2: logic [7:0] R; 
"divide.v", 8: always_comb begin 
if (x <= R) begin 
... 
"divide.v",6: R = y; 

code Mon SystemVerilog est:

module divider(input logic [7:0] x,y, 
       output logic [7:0] Q,R); 
    initial 
    begin 
     Q = 8'd0; 
     R = y; 
    end 
    always_comb 
    begin 
     if (x<=R) 
     begin R <= R - x; Q <= Q + 8'd1; end 
    end 
endmodule 

module test1; 

    logic [7:0] x,y,Q,R; 

    divider Divider1 (x,y,Q,R); 

    initial 
    begin 
     x = 8'd2; 
     y = 8'd8; 
    end 
endmodule 
+1

L'utilisation d'un bloc 'initial' dans votre module diviseur signifie qu'il ne sera pas synthétisable. Chaque fois que vous modélisez la logique séquentielle, vous avez besoin d'un schéma de réinitialisation. –

Répondre

2

Généralement, dans Verilog/SystemVerilog, vous ne pouvez pas affecter une variable à partir de deux blocs parallèles (à quelques exceptions près). Vous affectez à R et Q à partir de deux endroits: le bloc initial et le bloc always_comb.

Bien que le bloc initial ne s'exécute qu'une seule fois, il fonctionne en parallèle avec le bloc always_comb au début de la simulation, ce qui constitue une violation de cette règle. Pourquoi ne pas vous débarrasser du bloc initial et tout faire en always_comb?

always_comb 
    begin 
     Q = 8'd0;  // set initial value of Q 
     R = y;  // set initial value of R 
     ....   //THE REST OF THE ALGORITHM 
    end 

De plus, il vous manque une boucle!

+0

Merci pour l'indice! Je vais essayer et modifier! – codewarrior453

1

Une distinction importante entre l'écriture systemverilog (ou tout HDL) et de l'écriture dans toutes les langues de logiciel (C/C++, Java, etc) est que System Verilog est conçu pour faciliter décrivant les structures matérielles tout en permettant des bancs d'essai de type logiciel, tandis que les langages logiciels sont conçus pour permettre aux utilisateurs de donner des instructions à un interprete r, VM ou matériel réel. Cela étant dit, vous devez d'abord penser au matériel que vous essayez de décrire, puis écrire le code HDL associé. Il existe de nombreux articles décrivant les différences entre les HDL et les langages logiciels (ex: Can Verilog/Systemverilog/VHDL be considered actor oriented programming languages?). En regardant votre code et organigramme qui vous a été donné, il semble que vous essayez d'utiliser System Verilog comme langage de programmation plutôt que HDL. Par exemple, les blocs initiaux ne sont généralement utilisés que dans les bancs d'essai et non dans les modules eux-mêmes. De plus, comme votre algorithme est séquentiel, il est probable que vous aurez besoin d'un signal d'horloge et de registres, mais la façon dont votre code n'a pas les deux.

Idéalement, vous devriez avoir une bonne idée de la façon de concevoir des systèmes de matériel numérique avant d'essayer de coder n'importe quel HDL, car c'est la mentalité que vous devriez avoir en utilisant les HDL. L'objectif est généralement de traduire une conception matérielle en HDL, afin de comprendre la conception numérique aidera à clarifier beaucoup.

+0

Bien que SystemVerilog soit conçu pour être un HDL, je ne vois aucune raison de ne pas l'utiliser pour modéliser des algorithmes de type logiciel, spécialement quand la synthèse n'est pas un problème. En fait, la mise en œuvre de nombreux algorithmes dans SV est très similaire à celle de C++ et de langages similaires et ils sont même synthétisables. Que signifie vraiment «utiliser Verilog comme langage logiciel plutôt que HDL»? Certaines constructions de SystemVerilog sont encore plus puissantes que les langages logiciels. – Ari

+0

La publication d'origine contenait un lien vers une déclaration de problème où le code devait être synthétisé à l'aide de Design Compiler. Le code ci-dessus est très très non-synthétisable, donc je ne pensais pas qu'il valait la peine de tout expliquer et de régler le problème plus large à la place. Si la synthèse est une préoccupation, je pense que vous êtes d'accord que le code donné a besoin de beaucoup de travail pour le rendre synthétisable. Vous pouvez certainement implémenter des algorithmes logiciels dans SV, bien que généralement la conception soit un peu différente.Les constructions logicielles dans SV sont vraiment conçues comme des outils de testbench, pas pour être utilisées pour exécuter un programme par lui-même. – Unn

+0

Quant à l'utilisation de SV en tant que langage logiciel, je ne sais pas pourquoi vous voudriez le faire. Tout d'abord, vous auriez besoin d'un simulateur pour exécuter le programme (pas mal, je suppose que les langues ont besoin d'un interpréteur ou d'une machine virtuelle). Deuxièmement, même si je n'ai jamais utilisé de point de référence, quelque chose me dit que la performance d'un tel programme serait plutôt mauvaise. Je ne suis pas d'accord que beaucoup de choses sont plus faciles à faire en SV que de nombreux langages logiciels, mais je ne suis pas sûr que ça en vaut la peine ... – Unn

Questions connexes