nous avons conçu un alu en Verilog:Verilog erreur de simulation de code: référence -unresolved à rising_edge (clk)
module ALU (
output reg overflow_16_1, // overflow flag used for 16 bit addition and subtraction
output reg overflow_16_2, // overflow flag used for 16 bit addition and subtraction
output reg overflow_16_3, // overflow flag used for 16 bit addition and subtraction
output reg overflow_16_4, // overflow flag used for 16 bit addition and subtraction
output reg overflow_32_1, // overflow flag used for 32 bit addition and subtraction
output reg overflow_32_2, // overflow flag used for 32 bit addition and subtraction
output reg overflow_64, // overflow flag used for 64 bit addition and subtraction
output reg[63:0] z, // output of the ALU
input [63:0] X, // 64 bit input of the ALU
input [63:0] Y, // 64 bit input of the ALU
input [1:0] Operations, //to indicate the operation to be performed
input [2:0] Modes, // to indicate the word size of the operation
input clk
);
[email protected](posedge(clk))
begin
case(Modes)
3'b 000: //if the Mode is 000 perform one 64 bit Operation
case(Operations)
2'b 00:
{overflow_64,z} = {1'b0,X} + {1'b0,Y}; //if Operation == 00 perform addition
2'b 01:
{overflow_64,z} = {1'b0,X}-{1'b0,Y}; //if Operation == 01 perform subtraction
2'b 10: if (X<=Y) ////if Operation == 10 perform comparison
begin
z = Y; //if Y is greater o/p is Y
end
else
begin
z=X; //if X is greater o/p is X
end
default: $display("error in selecting operation"); // if the operation selection is invalid
endcase
3'b 001: case(Operations) // if the Mode == 001 perform two 32 bit Operations
2'b 00:
begin
{overflow_32_1,z[63:32]}={1'b0,X[63:32]}+{1'b0,Y[63:32]}; //if Operation == 00 perform addition
{overflow_32_2,z[31:0]}={1'b0,X[31:0]}+{1'b0,Y[31:0]};
end
2'b 01:
begin
{overflow_32_1,z[63:32]}={1'b0,X[63:32]}-{1'b0,Y[63:32]}; //if Operation == 01 perform subtraction
{overflow_32_2,z[31:0]}= {1'b0,X[31:0]}-{1'b0,Y[31:0]};
end
2'b 10:begin
if (X<=Y) ////if Operation == 10 perform comparison
begin
z[63:32]= Y[63:32]; //if Y is greater o/p is Y
z[31:0]= Y[31:0];
end
else
begin
z[63:32]= X[63:32]; //if X is greater o/p is X
z[31:0]= X[31:0];
end
end
default: $display("error in selecting the Modes"); // if the operation selection is invalid
endcase
3'b 010: case(Operations) // if the Mode == 010 perform four 16 bit Operations
2'b 00: begin
{overflow_16_1,z[63:48]}= {1'b0,X[63:48]}+ {1'b0,Y[63:48]}; //if Operations == 00 perform addition
{overflow_16_2,z[47:32]}= {1'b0,X[47:32]}+ {1'b0,Y[47:32]};
{overflow_16_3,z[31:16]}= {1'b0,X[31:16]}+ {1'b0,Y[31:16]};
{overflow_16_4,z[15:0]}= {1'b0,X[15:0]}+ {1'b0,Y[15:0]};
end
2'b 01:begin
{overflow_16_1,z[63:48]}= {1'b0,X[63:48]}- {1'b0,Y[63:48]}; // if Operations == 01 perform subtraction
{overflow_16_2,z[47:32]}= {1'b0,X[47:32]}- {1'b0,Y[47:32]};
{overflow_16_3,z[31:16]}= {1'b0,X[31:16]}- {1'b0,Y[31:16]};
{overflow_16_4,z[15:0]}= {1'b0,X[15:0]}- {1'b0,Y[15:0]};
end
2'b 10:begin
if (X<= Y) // if Operations == 10 perform comparison
begin
z[63:48]= Y[63:48]; // if Y is greater then o/p is Y
z[47:32]= Y[47:32];
z[31:16]= Y[31:16];
z[15:0]= Y[15:0];
end
else
begin
z[63:48]= X[63:48]; //else o/p is X
z[47:32]= X[47:32];
z[31:16]= X[31:16];
z[15:0]= X[15:0];
end
end
default: $display("error in selecting the operation"); // if the operation selection is invalid
endcase
default: $display("error in selecting the Modes"); // if the word size selection is invalid
endcase
end
endmodule
Je veux que le modèle de comportement pour être sensibles aux changements dans les entrées et la transition dans le o/p à se produire après le front montant de l'horloge. d'abord j'avais écrit le code comme ..
always(*)
begin
if(rising_edge(clk))
begin
..
Mais j'ai l'erreur tout en simulant en disant référence non résolue à
rising_edge(clk)
Comment puis-je résoudre ce problème? ou le code ci-dessus est très bien?
S'il vous plaît répondre
écrivez-vous votre mode de comportement en Verilog ou VHDL? 'rising_edge' est un concept vhdl qui a une implémentation complètement différente dans verilog. – Serge
Il n'y a pas 'rising_edge' dans le code. –
Il n'y a pas de mot-clé rising_edge dans Verilog. toujours @ (posedge clk) est bien. Pour moi, le code ci-dessus se compile bien. Quelle erreur obtenez-vous dans le code ci-dessus? –