在verilog中,我有一个错误,我无法通过。这是代码的第一位,然后是最后一位
module Decoder(op,funct,aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype); input[5:0] op,funct; output[2:0] aluop; output[1:0] btype; output mwr,mreg,mrd,alusrc,regdst,regwr; wire aluop,mwr,mreg,mrd,alusrc,regdst,regwr,btype; case(op) 6'b000000: begin case(funct) 6'b001010: assign aluop = 3'b010; 6'b001100: assign aluop = 3'b111; 6'b010001: assign aluop = 3'b011; default: assign aluop = 3'b000; endcase assign btype = 2'b00; assign mwr = 1'b0; assign mreg = 1'b0; assign mrd = 1'b0; assign alusrc = 1'b0; assign regdst = 1'b1; assign regwr = 1'b1; end
...
default: begin assign aluop = 3'b000; assign mwr = 0; assign mreg = 0; assign mrd = 0; assign alusrc = 0; assign btype = 2'b00; assign regdst = 0; assign regwr = 0; end endcase
endmodule
它一直给我以下错误
错误(10170):Decoder.v(7)附近文本“case”的Verilog HDL语法错误;期待“endmodule” 错误(10170):Decoder.v(14)附近文本“6”的Verilog HDL语法错误;期待“endmodule”
它也在每个结束语句和默认和结束时执行此操作
我不知道为什么会这样做,我对verilog来说还是新手。
提前致谢
答案 0 :(得分:6)
我相信您只能在case
区块内使用if/else
语句或always
。我不确定为什么你的错误信息没有说一些更有帮助的东西,但这可能是问题所在。
尝试重写您的代码,如下所示:
//change wire types to reg type
always @*
begin
case (op)
6'b000000: begin
aluop = 3'b000
end
...
endcase
end
答案 1 :(得分:2)
这是一个猜测,但编译器抱怨,因为它可能期望IEEE 1364-2001 verilog并且您的代码对此版本的语言无效。在任何情况下,Tim的代码可能都是您正在寻找的功能。
至于为什么它无效,Verilog在每个模块声明中基本上包含两个“上下文”。直接出现在模块中的任何内容都是模块项。这些包括reg / wire声明,assign语句,always语句,生成构造和模块实例。
module mod;
reg reg1; //Module item
wire wire1; //Module item
assign wire1 = 0; //Module item
always reg1 = 0; //Module item
parameter con1 = 0; //Module item
//Instances a different module based on con1
case(con1) //Module item
0:mod2 inst1(reg1);
1:mod3 inst1(reg1);
2:mod4 inst1(reg1);
endcase
endmodule
其次,存在程序性语境,其中可以存在程序性陈述。这是任务声明,函数声明,始终块,初始块和一些其他区域中的任何代码。
module mod2;
reg a;
always
begin
a = 0; //Procedural statement
end
initial
a = 0; //Procedural statement
function func1(input arg1);
case (arg1) //Procedural statement
0:func1 = 0;
default:func1 = 9;
endcase
endfunction
endmodule
自2001年以来,Verilog包含两种类型的案例陈述,程序案例陈述和生成案例陈述。程序性案例陈述的工作方式与过程语言中的有效,但必须出现在程序上下文中。生成案例语句在模拟开始之前进行静态评估,并且可能仅作为模块项出现在模块声明上下文中。请注意,第二个上下文要求case表达式是常量。
在最新版本的verilog,1364-2005中,生成案例可能直接出现在模块范围内,但在2001版本的语言中,任何生成项都必须包含generate..endgenerate
个关键字。如果您的编译器期望IEEE 1364-2001,那么您看到的错误消息是有意义的。