Назначение двум разным проводам бита и его дополнения дает одно и то же значение

В настоящее время я создаю блок управления конвейерным процессором с использованием 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 дают одно и то же значение, несмотря на то, что они дополняют друг друга. Вот результаты тестового стенда для образца теста.

Заранее спасибо за любые ответы.

Я пробовал использовать оба! и ~, кроме этого я понятия не имею, как это исправить. Я тоже пробовал менять индексацию, но безрезультатно.

Это единственная дополнительная пара, которая неверна?

user207421 09.04.2024 08:18

Нет, это все они. Я так понимаю, это как-то связано с моим синтаксисом? Но ради Бога я не могу найти ничего плохого.

user24140032 09.04.2024 08:20

Думаю, ты мог бы попробовать ^,

user207421 09.04.2024 08:25

Это для двух операторов xor. Если вы говорите о замене, то компилятор просто выдаст ошибку.

user24140032 09.04.2024 08:34

Я не знаю Verilog из норы в земле, но я нашел документ о синтаксисе/операторе с примерами его использования в качестве унарного оператора.

user207421 09.04.2024 08:37

Хорошо, я попробую!

user24140032 09.04.2024 09:06

Извините, это был мой первый вопрос, в следующий раз опубликую MRE!

user24140032 10.04.2024 17:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема дизайна, о которой говорится в тексте сообщения, отсутствует в опубликованном коде.

Вот простой tb, который управляет последовательностью 32'b0, 1, 2, 3 в коде операции.

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
    // FOR EDA PLAYGROUND $dumpfile("dump.vcd"); $dumpvars;
    $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 

и эти волны

используя опубликованный код в качестве DUT.


Код ведет себя так, как ожидалось, что-то еще не так.

Спасибо за ответ. Это была проблема с общей интеграцией модуля. Мне следовало добавить больше контекста. Тем не менее спасибо за ответ.

user24140032 10.04.2024 17:31

Другие вопросы по теме