오른쪽 크기를 변경하는 Verilog

Jan 14 2021

나는 무언가를 보여주기 위해 다음과 같은 기본 모듈이 있습니다.

module tb();

reg [2:0] U;
reg [2:0] T;
reg [2:0] C;
reg E;

initial begin

    U = 5;
    T = 3;
    {E, C} = U + ~T + 1'b1;
    #1000;

end

endmodule

내가 기대하는 것은 E가 1이기 때문입니다.

U 이다 101

T 이다 011

U + ~T + 001이다

   101
   100
   001
+______
= 1010 

따라서 C는 010 부분을 얻고 E는 1을 얻습니다. 이것은 예상되는 동작이지만 C는 동일하지만 E는 0입니다. verilog는 왼쪽이 4 비트이기 때문에 RHS 변수의 크기를 4 비트로 늘리는 것 같습니다 ( 1 + 3). 그러나 T의 경우 T를 보완하기 전에 선행 0을 추가하므로 T는 0011이되고 그 보수는 T 보수의 4 비트 버전 인 0100 대신 1100이됩니다.

그리고 이것은,

   0101
   1100
   0001
+______
= 10010 

이로 인해 E는 0이됩니다.

나는 이것이 왜 그런지 이해하지 못하며 선행 0을 추가하기 전에 보완을 수행하는 방법을 찾을 수 없습니다.

대신 다음을 수행하면 제대로 작동하고 E는 1을 얻습니다.

    U = 5;
    T = 3;
    T = ~T;
    {E, C} = U + T + 1'b1;

이것은 내 의심이 옳다는 것을 확인시켜줍니다. 그래서 저는 그런 해결책이 있습니다. 그러나 나는 그것에별로 만족스럽지 않다. 그런 행동을 막을 방법이 있어야한다고 생각한다.

어떤 도움을 주시면 감사하겠습니다.

답변

3 dave_59 Jan 14 2021 at 05:55

폭이 다른 피연산자가 혼합 된 경우 Verilog에는 표현식의 컨텍스트를 기반으로 가장 큰 피연산자의 너비에 맞게 각 피연산자의 크기를 조정하는 규칙이 있습니다. LHS가 4 비트이고 RHS의 피연산자가 4 비트로 확장된다는 것을 올바르게 지적했습니다. 이것은 작업 적용 하기 전에 발생 합니다.

연결의 피연산자가 자체 결정된 컨텍스트라는 사실을 활용하여이 문제를 해결할 수 있습니다.

{E, C} = U + {~T} + 1'b1;

이제의 너비는의 너비에 ~T의해서만 결정됩니다 T.