用一个位及其补码分配给两条不同的线会产生相同的值

问题描述 投票:0回答:1

我目前正在使用 Verilog 为流水线处理器创建一个控制单元。我正在使用电线进行组合分配。由于我仅支持有限的指令,因此我决定仅使用有限的位来分配控制信号。

以下是主控单元代码:

module mcu(
    input [5:0] Opcode,
    output ALUSrc,
    output [1:0] ALUop,
    output RegDst,
    output MemWrite,
    output MemRead,
    output MemtoReg,
    output RegWrite
    );
    
    assign ALUSrc = (Opcode[0]);
    assign ALUop[0] = (!Opcode[0]);
    assign ALUop[1] = (!Opcode[5]);
    assign RegDst = (!Opcode[0]);
    assign MemWrite = (Opcode[3]);
    assign MemRead = (!Opcode[3]);
    assign MemtoReg = (!(Opcode[0]^Opcode[1]));
    assign RegWrite = (Opcode[5]^Opcode[3]);
    
endmodule

然而,

ALUSrc
RegDst
尽管是互补的,但产生相同的值。 Here is the testbench results for a sample test.

提前感谢您的回答。

我尝试同时使用两者!和〜,除此之外我不知道如何解决。我也尝试过更改索引,但无济于事。

architecture verilog
1个回答
0
投票

问题不在发布的代码中。
这个小TB。

module tb ();
  
  reg [5:0] Opcode;
  reg ALUSrc;
  reg [1:0] ALUop;
  reg RegDst;
  reg MemWrite;
  reg MemRead;
  reg MemtoReg;
  reg RegWrite;
  integer i;
  
  mcu dut(
    .Opcode(Opcode),
    .ALUSrc(ALUSrc),
    .ALUop(ALUop),
    .RegDst(RegDst),
    .MemWrite(MemWrite),
    .MemRead(MemRead),
    .MemtoReg(MemtoReg),
    .RegWrite(RegWrite)
  );
  
  initial begin
    $monitor("Opcode = %h, ALUSrc = %h RegDst = %h ",Opcode,ALUSrc,RegDst);
    
    for(i = 0; i < 4;i++)begin
      Opcode = i;
      #1;
    end
    
  end

endmodule

产品

xcelium> run
Opcode = 00, ALUSrc = 0 RegDst = 1 
Opcode = 01, ALUSrc = 1 RegDst = 0 
Opcode = 02, ALUSrc = 0 RegDst = 1 
Opcode = 03, ALUSrc = 1 RegDst = 0 

波浪
使用发布的代码作为测试中的设计。

© www.soinside.com 2019 - 2024. All rights reserved.