verilog - 这些行在 Verilog 中是否合法?
问题描述
我正在研究Verilog 中 rs232 协议的 RTL 编码我在两个不同的文件中编写了 Tx/Rx 代码。
我想知道这些行[如下所示]在verilog中是否合法。合法我的意思是他们产生可合成的输出吗?我已将 count_tx 初始化为 12。基本上,我希望通过 dataframe_tx 进行串行输出。我知道我们可以通过逻辑左移来做到这一点,但我使用了这种方法。
在波形分析仪中,我可以看到 dataframe_tx 始终为零。这就是我开始怀疑这些台词的地方。
.
.
.
S_SENDING:begin
dataframe_tx = temp_tx[12-count_tx];
count_tx = count_tx - 1;
if(count_tx)
next_tx = S_SENDING;
else begin
next_tx = S_DONE;
done_tx = 1'b1;
end
end
.
.
.
.
解决方案
回答您的问题:您发布的代码片段由合法的 SystemVerilog 构造组成。
如果添加了您引用的对象的正确声明,添加了明显缺失的case
语句并将整个语句包装在一个always_ff
块中,它将编译并因此生成可合成的代码。你问的是语法而不是语义。它会起作用吗?从片段很难分辨。但是您声明的意图if
似乎是检查向量是否非零。if( |count_tx )
改为考虑。我在您的代码中添加了几行代码,以确保语法正常。我还可以自由地将分配更改为非阻塞,因为否则工具会推断出这些分配。仍然是一个片段,但我希望它可能会有所帮助。
module Sandbox(
input logic clk
// inputs and outputs ...
);
logic dataframe_tx;
logic [12:0] temp_tx;
logic done_tx;
logic [3:0] count_tx;
enum {S_SENDING, S_DONE} next_tx;
always_ff @(posedge clk) // as an example
begin
case (next_tx)
// something ...
S_SENDING: begin
dataframe_tx <= temp_tx[12-count_tx];
count_tx <= count_tx - 1;
if( |count_tx )
next_tx <= S_SENDING;
else begin
next_tx <= S_DONE;
done_tx <= 1'b1;
end
end
// something ....
S_DONE: /* your code */;
endcase
end
endmodule
祝你好运!
推荐阅读
- php - 如何在PHP中替换字符串中一个数字加上一个空格的所有匹配项
- javascript - 链接向右滚动向下滚动
- php - 如何在 JsonObject 中获取值
- python - 无法部署 GCP Python 云函数
- python - 跳过重复的熊猫滚动窗口
- roslyn - Roslyn 是否支持项目/编译级诊断的代码修复操作(没有位置)?
- php - 没有 Laravel 日志或 Apache 日志的新 Laravel 8 安装 500 服务器错误
- excel - 如何检查 Shape.ParentGroup?
- css - 比 div 宽度更小的水平滚动条?+ 没有图片说明?
- postgresql - Vapor 中的多个数据库