Перейти к содержанию
    

SystemVerilog, сложение/вычитание неравных по размеру "переменных"

Форумчане привет.

Натолкнул меня на этот вопрос сначала моделсим, которые заставил переделать все операции сложения.
У меня такой вопрос. Имею код

Какой получу результат в val при однократном исполнении? Я думал 0x0100. На деле на бою получаю 0x0000, то есть заинкрементил только младший байт.
 

reg [15:0] val
  
initial begin 
	val <= 16'h00ff;
end
  
always (...) begin
	val <= val + 1'b1;
end

Правильней ли всегда писать так? Или квартус сам разберется?

reg [15:0] val
  
initial begin 
	val <= 16'h00ff;
end
  
always (...) begin
	val <= val + 16'd1;
end

 

Если вдруг имеет значение указание битности, то как правильно сложить разные по ширине значения? Будет ли в таком примере такой же непредсказуемый результат?

reg [15:0] val_1;
reg [3:0]  val_2;
  
initial begin 
	val_1 <= 16'h00ff;
  	val_2 <= 4'd4;
end
  
always (...) begin
	val_1 <= val_1 + val_2;
end

Заранее спасибо

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

7 minutes ago, new123 said:

Я думал 0x0100. На деле на бою получаю 0x0000, то есть заинкрементил только младший байт.

Чудеса чудесные -  но  кажется мне что тут глюк где то в другом месте вашего кода.

С точки зрения языка   val <= val + 1'b1;   и val <= val + 16'd1;   одинаковые операции - так как  по стандарту  ширина  обоих операндов расширяется до максимального из двух. 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, RobFPGA said:

так как  по стандарту  ширина  обоих операндов расширяется до максимального из двух

лень вот прям сейчас подымать свои толмуты кода перед сном, может завтра будут силы. Моделсим наотказ не захотел нормально делать, пока сам не расширил.
Спасибо, поищу дальше.

 

upd. Нашел причину

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Квеста на код:
 

reg [15:0] val;
  
initial begin 
    val <= 16'h00ff;
end
  
always @(posedge clk) begin
    #1ns
    val <= val + 1'b1;
    $strobe("val: %x", val);
    #1ns
    $stop(2);
end

 

выдаёт:

# val: 0100

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...