Verilog case 语句返回不正确的值
Verilog case statement returning incorrect values
我应该使用 case 语句编写一个简单的 CU,但输出与我在 case 语句中指定的不匹配。我想我在这里犯了一些根本性的错误,但我不知道是什么。
这是我的模块:
`timescale 1ns / 1ps
module ControlUnit(Opcode, RegDst, Jump, Branch, MemRead,
MemtoReg, ALUOp, MemWrite, ALUSrc, RegWrite);
/* IO */
// Inputs
input [5:0] Opcode;
// Outputs
output [1:0] ALUOp;
output RegDst;
output Jump;
output Branch;
output MemRead;
output MemtoReg;
output MemWrite;
output ALUSrc;
output RegWrite;
// Hold output value from case statement.
reg [9:0] out;
// Assign outputs based on Opcode recieved.
always@( * ) begin
case( Opcode )
// out format:
// RegDst,ALUSrc,MemtoReg,RegWrite,MemRead,MemWrite,Branch,Jump,ALUOp
6'b00_0000 : out = 1_0_0_1_0_0_0_0_10 ; // R-Type
6'b10_0011 : out = 0_1_1_1_1_0_0_0_00 ; // lw
6'b10_1011 : out = 0_1_0_0_0_1_0_0_00 ; // sw
6'b00_0100 : out = 0_0_0_0_0_0_1_0_01 ; // beq
6'b00_0010 : out = 0_0_0_0_0_0_0_1_00 ; // j
default : out = 0_0_0_0_0_0_0_0_00 ; // Default case.
endcase
end
// Assign outputs according to result from case statement.
assign { RegDst, ALUSrc, MemtoReg, RegWrite,
MemRead, MemWrite, Branch, Jump,
ALUOp } = out;
endmodule
这是我得到的输出:
操作码:输出
00_0000 : 0001001010
10_0011 : 0001100000
10_1011 : 0000010000
00_0100 : 1111101001
00_0010 : 0001100100
None 符合任何一种情况。对于我的测试台,我只使用 Xilinx 生成的内容加上以下内容:
initial begin
// Initialize Inputs
Opcode = 0;
// Add stimulus here
Opcode = 6'b00_0000;
#100
Opcode = 6'b10_0011;
#100
Opcode = 6'b10_1011;
#100
Opcode = 6'b00_0100;
#100
Opcode = 6'b00_0010;
#100
Opcode = 6'b00_0010;
end
分配的一个限制是我们不应该实现状态机并且必须使用这个确切的端口列表,因此是 case 语句。我还在网上看到这可以用一系列赋值语句来完成,但老师说可以用 case 语句来完成,所以我想弄清楚。
您忘记在 out
作业前添加 10'b。应该是
out = 10'b1001000010
.
否则它会将其作为十进制格式(不是二进制格式)的整数值。
我应该使用 case 语句编写一个简单的 CU,但输出与我在 case 语句中指定的不匹配。我想我在这里犯了一些根本性的错误,但我不知道是什么。
这是我的模块:
`timescale 1ns / 1ps
module ControlUnit(Opcode, RegDst, Jump, Branch, MemRead,
MemtoReg, ALUOp, MemWrite, ALUSrc, RegWrite);
/* IO */
// Inputs
input [5:0] Opcode;
// Outputs
output [1:0] ALUOp;
output RegDst;
output Jump;
output Branch;
output MemRead;
output MemtoReg;
output MemWrite;
output ALUSrc;
output RegWrite;
// Hold output value from case statement.
reg [9:0] out;
// Assign outputs based on Opcode recieved.
always@( * ) begin
case( Opcode )
// out format:
// RegDst,ALUSrc,MemtoReg,RegWrite,MemRead,MemWrite,Branch,Jump,ALUOp
6'b00_0000 : out = 1_0_0_1_0_0_0_0_10 ; // R-Type
6'b10_0011 : out = 0_1_1_1_1_0_0_0_00 ; // lw
6'b10_1011 : out = 0_1_0_0_0_1_0_0_00 ; // sw
6'b00_0100 : out = 0_0_0_0_0_0_1_0_01 ; // beq
6'b00_0010 : out = 0_0_0_0_0_0_0_1_00 ; // j
default : out = 0_0_0_0_0_0_0_0_00 ; // Default case.
endcase
end
// Assign outputs according to result from case statement.
assign { RegDst, ALUSrc, MemtoReg, RegWrite,
MemRead, MemWrite, Branch, Jump,
ALUOp } = out;
endmodule
这是我得到的输出:
操作码:输出
00_0000 : 0001001010
10_0011 : 0001100000
10_1011 : 0000010000
00_0100 : 1111101001
00_0010 : 0001100100
None 符合任何一种情况。对于我的测试台,我只使用 Xilinx 生成的内容加上以下内容:
initial begin
// Initialize Inputs
Opcode = 0;
// Add stimulus here
Opcode = 6'b00_0000;
#100
Opcode = 6'b10_0011;
#100
Opcode = 6'b10_1011;
#100
Opcode = 6'b00_0100;
#100
Opcode = 6'b00_0010;
#100
Opcode = 6'b00_0010;
end
分配的一个限制是我们不应该实现状态机并且必须使用这个确切的端口列表,因此是 case 语句。我还在网上看到这可以用一系列赋值语句来完成,但老师说可以用 case 语句来完成,所以我想弄清楚。
您忘记在 out
作业前添加 10'b。应该是
out = 10'b1001000010
.
否则它会将其作为十进制格式(不是二进制格式)的整数值。