Jump to content

    

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

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

Edited by new123

Share this post


Link to post
Share on other sites

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

7 minutes ago, new123 said:

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

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
9 minutes ago, RobFPGA said:

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

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

 

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

Edited by new123

Share this post


Link to post
Share on other sites

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

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

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now